485引脚悬空,却接收到一串乱码。
ucHostAddress=(unsigned char)atol(argv[1]);
ucSlaveAddress=(unsigned char)atol(argv[2]);
ucSensorAddress=(unsigned char)atol(argv[3]);
ucRegAddress=(unsigned char)atol(argv[4]);
uiRegNum=(unsigned int)atol(argv[5]);
uiTTLtime=(unsigned int)atol(argv[6]);
if((ucSensorAddress >= 0)&&(ucSensorAddress <= 180))
{
/*generate command package*/
cpCommandPackage[0] = (char)0xA5;
cpCommandPackage[1] = (char)ucHostAddress; //HostAddress
cpCommandPackage[2] = (char)uilength; //data length
cpCommandPackage[3] = (char)ucSlaveAddress; //SlaveAddress
cpCommandPackage[4] = (char)((uiTTLtime >> 24) & 0x00FF); //TTLtime
cpCommandPackage[5] = (char)((uiTTLtime >> 16) & 0x00FF);
cpCommandPackage[6] = (char)((uiTTLtime >> 8) & 0x00FF);
cpCommandPackage[7] = (char)(uiTTLtime & 0x00FF);
cpCommandPackage[8] = (char)ucSensorAddress; //SensorAddress
cpCommandPackage[9] = (char)0x03; //function code
cpCommandPackage[10] = (char)((ucRegAddress >> 8) & 0x00FF); //reg address high byte
cpCommandPackage[11] = (char)(ucRegAddress & 0x00FF); //reg address low byte
cpCommandPackage[12] = (char)((uiRegNum >> 8) & 0x00FF); //read reg number high byte
cpCommandPackage[13] = (char)(uiRegNum & 0x00FF); //read reg number low byte
/*get CRC16*/
wCRC16 = CRC16_2(&cpCommandPackage[8], 6);
cpCommandPackage[14] = (char)(wCRC16 & 0x00FF); //crc16 code low byte
cpCommandPackage[15] = (char)((wCRC16 >> 8) & 0x00FF); //crc16 code high byte
xor=xorCheck((char*)cpCommandPackage, 16);
cpCommandPackage[16] = (char) xor; //xor code
iFile = open("/dev/ttyATH0", O_RDWR | O_NOCTTY | O_NONBLOCK, 0);
if(-1 == iFile )
{
printf("open 485 port err...\n");
return -1;
}
else
{
if((ret=setport(iFile,4800,8,1,'N')) < 0)
{
printf("set port faild!\n");
return -1;
}
len = write(iFile, cpCommandPackage, uilength);
printf("\n** Getsensor -->Tx_commandpackage -- length:%d , sensoraddr:%d , Regaddr:%d.\n", len,(int)ucSensorAddress,(int)ucRegAddress);
printf("[");
for(i = 0;i< len ;i++)
printf("%02x,",cpCommandPackage[i]);
printf("]\n");
printf("\r\n");
if((cpCommandPackage[4] == 0)&&(cpCommandPackage[5] == 0)&&(cpCommandPackage[6] == 0)&&(cpCommandPackage[7] == 0))
{
sleep(2);
}
else
{
usleep(100000);
}
ret = read(iFile, cpAnswerPackage,15+uiRegNum*2);
// cpAnswerPackage[ret] = '\0';
close(iFile);
printf("\n** Getsensor -->Rx_ackpackage --length:%d , Sensoraddr:%d , Regaddr:%d.\n",ret,(int)ucSensorAddress,(int)ucRegAddress);
printf("[");
for(i = 0;i < ret;i++)
printf("%02x,",cpAnswerPackage[i]);
printf("]");
printf("\r\n");

想问问是程序的原因,还是硬件的原因?求解!
相关推荐
基于74HC14的噪声抑制电路:深度剖析工作原理
74HC14芯片内置施密特触发器,凭借其回差特性有效抑制输入噪声,提升数字信号抗干扰能力。电路设计中,通过合理设置阈值电压,使缓慢变化或带毛刺的信号被整形为干净方波,是嵌入式系统和传感器接口中常用的噪声抑制方案。
树莓派Pico串口通信实战:从UART初始化到协议粘包排查
串口通信作为嵌入式开发中最基础也最实用的外设接口,是连接开发板与外部世界的重要桥梁。UART通过两根数据线实现异步收发,原理简单但应用广泛。在树莓派Pico等开发板上,串口不仅是调试的隐形屏幕,更是与PC、传感器、舵机等设备通信的关键链路。通过MicroPython的machine.UART模块,开发者可以快速实现数据收发,但实际工程中常遇到电平不匹配、波特率错误、粘包半包等问题。本文从串口基础概念出发,系统梳理RP2040的UART特性、MicroPython编程方法、PC端调试工具链以及常见故障排查思路
RS485通信接口电路设计的Proteus仿真全过程演示
手把手带你完成RS485通信接口电路的设计与调试,重点展示如何在Proteus中搭建模型、配置收发器参数、验证差分信号传输稳定性。全程紧扣Proteus仿真实操细节,覆盖从原理图绘制到波形观测的关键步骤,助力硬件工程师快速掌握工业通信接口的虚拟验证方法。
RS485物理层干扰排查实战:30分钟定位Modbus通讯故障根源
RS485总线是工业现场Modbus RTU通信的物理基础,其差分传输特性虽能抑制共模噪声,但实际易受传导、辐射、接地及阻抗失配四类干扰影响。当出现CRC错误、超时或非法地址等现象时,问题往往不在协议配置,而源于屏蔽层处理不当、终端电阻缺失、地电位差超标或线缆阻抗不匹配等物理层缺陷。掌握示波器波形分析、共模电压实测与分段隔离法,可快速识别变频器耦合噪声、接地环路或信号反射等典型干扰源。本文聚焦真实产线场景,提供面向自动化工程师的可落地诊断路径与器件选型建议,助力稳定可靠的数据链路构建。
MPC8308 DUART与eSDHC接口硬件设计与驱动开发实战指南
在嵌入式系统开发中,串行通信接口和存储控制器是连接处理器与外部设备的核心模块。串行通信基于异步串行协议,通过UART实现设备间的可靠数据交换;存储控制器则遵循SD/MMC协议,为系统提供高速、标准化的存储扩展能力。理解这些接口的硬件信号定义、电气特性和配置原理,是确保底层驱动稳定运行和硬件设计一次成功的基础。其技术价值在于,通过精确的时序控制、合理的阻抗匹配以及正确的协议栈实现,能够显著提升系统通信的可靠性和数据存取效率。这些技术广泛应用于工业控制、网络通信设备及便携式终端等场景。本文聚焦于MPC8308处


单片机/工控
