本帖最后由 liyancao001 于 2018-6-9 16:35 编辑
我用了3个串口调试软件与IAP15W4K61S4通讯,中间是SP3232和USB转232,单片机程序是modbus RTU的程序。然后用STC下载软件查询数据可以得到返回。用另一个叫modscan32的软件却得不到返回数据。 中间我用串口监视器查看的数据,向单片机发送的数据都是对的。但modscan却得不到返回数据。另外modscan这个我经常用的,都是设置的8位数据位,9600波特率,无校验,1停止位。
我还用串口调试器.exe试过,都是正常返回的。
问题出在哪里呢?modscan用来测试modbus很直观,不想用其他的代替。
又试了下,在STC单片机程序里 在发送返回数据之前做一个500ms的延时就可以接收到了。。。这是什么原因呢?
这是串口中断代码:
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也很好。
从加延时前后的情况比较的话可以猜测,查询指令都是正确发送到单片机中的,但是不加延时时为什么就不送呢,rece_end_flag这个标志位应该也都是置1的啊
|