我用了3个串口调试软件与IAP15W4K61S4通讯,中间是SP3232和USB转232,单片机程序是modbus RTU的程序。然后用STC下载软件查询数据可以得到返回。用另一个叫modscan32的软件却得不到返回数据。 中间我用串口监视器查看的数据,向单片机发送的数据都是对的。但modscan却得不到返回数据。另外modscan这个我经常用的,都是设置的8位数据位,9600波特率,无校验,1停止位。
我还用串口调试器.exe试过,都是正常返回的。
问题出在哪里呢?modscan用来测试modbus很直观,不想用其他的代替。
这是串口中断代码:
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
rece_posi=8;
if(rece_end_flag==0)
{
if(rece_count==0) //控制器地址
{
if(SBUF==Load_ADDR){rece_buff[0] = SBUF;rece_count++;}
else {rece_count = 0;rece_posi = 0;rece_end_flag = 0;}
}
else if(rece_count==0x01) //功能码,正常为0x03
{
if(SBUF==0x03){rece_buff[1] = SBUF;rece_count++;}
else {rece_count = 0;rece_posi = 0;rece_end_flag = 0;}
}
else //结束判断
{
if(rece_count>=(rece_posi-1)) //rece_count = 2+rece_buff[1]+2
{
rece_buff[rece_count] = SBUF;
rece_count = 0;
rece_posi = 0;
rece_end_flag = 1;
}
else
{
rece_buff[rece_count] = SBUF;
rece_count++;
}
}
}
}
}
这是主函数中的发送返回指令的代码(在while(1)里面):
if(rece_end_flag==1)
{
Modbus_Send();
rece_count = 0;
rece_posi = 0;
rece_end_flag = 0;
}
这个用STC下载软件自带的串口助手可以得到返回数据,但是用modscan不行。
这是主函数中的发送返回指令的代码(在while(1)里面),加延时函数的:
if(rece_end_flag==1)
{
Delay500ms();//多加的延时函数
Modbus_Send();
rece_count = 0;
rece_posi = 0;
rece_end_flag = 0;
}
这个用STC下载软件自带的串口助手可以得到返回数据,用modscan也很好。并且延时20ms以上都可以正常,10ms以内不行。
从加延时前后的情况比较的话可以猜测,查询指令都是正确发送到单片机中的,但是不加延时时为什么就不送呢,rece_end_flag这个标志位应该也都是置1的啊
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
第二:我觉得你可以数据解析不要放在中断解析,可以在中断里面把一帧数据接收完了建立个标志在main里面进行解析(STC的可能没有像32那样有空闲中断,但是你可以用个定时器20ms等接收超时来判断是否一帧数据接收完成),这样在中断里面可以快速响应。
第三,你选用的这款STC是自带仿真器的,你可以试下仿真看下数据是否丢包等问题啊。不是仅仅靠猜测来解决问题。
我就是在串口中断里把rece_end_flag置1的,然后主函数中处理
谢谢回复,回头试试
一周热门 更多>