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
在这里实现具体命令,同样是抄上面的
这里使用还没有用到的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#部分
分类:
计算机
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章