485引脚悬空,却接收到一串乱码。

pcjoyguo 2018-08-04 03:23:25
cpu芯片是ar9344,485芯片是sp485re,测试485模块读写,A发送一串数据指令,B接收到指令后,给A反馈一串数据指令,但是在485 引脚悬空的情况下却能收到一串乱码数据。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");

想问问是程序的原因,还是硬件的原因?求解!
...全文
723 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2018-08-08
  • 打赏
  • 举报
回复
如果用,就不要悬空,用上拉电阻拉到高电平。如果不用,就不要去接收。
yishumei 2018-08-08
  • 打赏
  • 举报
回复
建议查一下终端电阻
worldy 2018-08-07
  • 打赏
  • 举报
回复
485 引脚悬空是啥意思?你自己做芯片级焊接?还是你把485的另一端悬空?

C_Rabbit 2018-08-06
  • 打赏
  • 举报
回复
上示波器是最直接的检测办法,乱码的起因千奇百怪,先用示波器检测信号判断排除硬件上的干扰,再查软件bug
ckc 2018-08-05
  • 打赏
  • 举报
回复
看看是不是波特率设置有误差
pcjoyguo 2018-08-04
  • 打赏
  • 举报
回复
而且如果回17个数据,得到的数据长度的确是17,但是它是乱码和那17个数据的前一段组成的,也就是说回的数据被截断了。

pcjoyguo 2018-08-04
  • 打赏
  • 举报
回复
我把485的A、B和通过485串口电脑连在一起,也会出现乱码
dceacho 2018-08-04
  • 打赏
  • 举报
回复
悬空后状态是处于一种不确定状态,什么都有可能

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧