Arduino LINX 实现上拉输入,并且实现对应VI以及C#调用(以MEGA2560PRO为例)

固件部分思路:Arduino本身可以设置INPUT_PULLUP,而LINX中没有。猜测原因是LINX在具体实现中将PINMODE设置为INPUT,并且没有实现INPUT_PULLUP版本。因此只要修改LINX固件,增加PULLUP版本的实现即可。(如果不需要普通的浮空输入,直接把源代码里的INPUT改成INPUT_PULLUP即可,无须后续操作,这样所有能上拉的输入都会被上拉)

环境需求

  • Arduino IDE(用于烧录修改后的固件)
  • LabView+MakerHUB包(用于导出固件以及在LabView中测试)
  • C#.NET framework4.8(up所使用的版本罢了)

导出固件

默认导出路径为 文档/Arduino/libaraies中

修改固件代码(总共5个文件)

1. libraries\LinxArduinoMega2560\utility\LinxWiringDevice.h

增加函数声明

2. libraries\LinxArduinoMega2560\utilityLinxWiringDevice.cpp

实现函数(直接抄上面的非PULLUP版本,改一下)

int LinxWiringDevice::DigitalReadPullUp(unsigned char numChans, unsigned char* channels, unsigned char* values)
{
	unsigned char bitOffset = 8;
	unsigned char byteOffset = 0;
	unsigned char retVal = 0;

	//Loop Over channels To Read
	for(int i=0; i<numChans; i++)
	{
		//If bitOffset Is 0 We Have To Start A New Byte, Store Old Byte And Increment OFfsets
		if(bitOffset == 0)
		{
			//Insert retVal Into Response Buffer
			values[byteOffset] = retVal;
			retVal = 0x00;
			byteOffset++;
			bitOffset = 7;
		}
		else
		{
			bitOffset--;
		}

		//Read From Next Pin
		unsigned char pinNumber = channels[i];

		pinMode(pinNumber, INPUT_PULLUP);			// 就是在这边修改,直接抄上面DigitalRead的代码,然后改成INPUT_PULLUP
		retVal = retVal | (digitalRead(pinNumber) << bitOffset);	//Read Pin And Insert Value Into retVal
	}

	//Store Last Byte
	values[byteOffset] = retVal;

	return L_OK;
}

下面两个2个LinxDevice.h

添加函数声明(其实可以发现LinxDevice是基类…应该可以直接修改基类而不用修改子类,但算了,瞎改改,全部都改了就是…

3. libraries\LinxArduinoMega2560\utility\LinxDevice.h

4. libraries\LinxSerialListener\utility\LinxDevice.h

5. libraries\LinxSerialListener\LinxListener.cpp

在这里实现具体命令,同样是抄上面的
图片[1]-Arduino LINX 实现上拉输入,并且实现对应VI以及C#调用(以MEGA2560PRO为例)-牛翰网
这里使用还没有用到的0x0045,

case 0x0045: // Digital Read
		{
			unsigned char numRespBytes = (((commandPacketBuffer[1]-7)-1) >> 3) +1;
			status = LinxDev->DigitalReadPullUp((commandPacketBuffer[1]-7), &commandPacketBuffer[6], &responsePacketBuffer[5]);
			PacketizeAndSend(commandPacketBuffer, responsePacketBuffer, numRespBytes, status);
			break;
		}

编译下载进目标板:略

至此,就在固件中添加了上拉输入的功能(LINX理论上也支持custom command,可以不侵入源代码的情况下实现。但我试了一下,说MEGA2560不支持自定义命令,作罢)

LabView部分思路:检查官方VI发现,DigitalRead使用命令0x0042。只要把相关VI复制一遍,把最底层VI的CMD改成上文中自定义的0x0045即可。(本文需要LabView基础

最底层VI

改成0x0045

一层一层封装回去 读N

读1

最终抄袭官方VI,获得了3个相同功能,但是获得结果为上拉输入的VI。

C#部分

https://www.cnblogs.com/209jkjkjk/p/18619801

来源链接:https://www.cnblogs.com/209jkjkjk/p/18619805

© 版权声明
THE END
支持一下吧
点赞6 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容