网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > .Net >

Arduino LINX 实现上拉输入,并且实现对应VI以及C

时间:2024-12-20 18:36

人气:

作者:admin

标签:

导读:固件部分思路:Arduino本身可以设置INPUT_PULLUP,而LINX中没有。猜测原因是LINX在具体实现中将PINMODE设置为INPUT,并且没有实现INPUT_PULLUP版本。因此只要修改LINX固件,增加PULLUP版本的实现即...

固件部分思路: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#部分

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

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信