马老师:请教一个通讯的问题。
1、通讯接收采用中断+缓冲区的方式2、通讯解析函数在主程序中执行
3、上位机定时每隔150ms给单片机发送一帧数据
如果主程序的执行时间很长,例如:主程序大约执行500ms,那么通讯质量就不是非常差了吗?
void main()
{
//初始化
while (1)
{
//通讯解析函数
//其它函数
}
} 如果上位机是一个需要应答的MODBUS协议,那么在规定的时间内没有收到单片机的
应答帧,会造成通讯不畅。
如何解决这种问题? 不知道我的思路是否可行。
采用状态机方式。
1、把主程序分成n组
2、每次只执行一组。
void main()
{
//初始化
while (1)
{
//通讯解析函数
switch (status)
{
case 0:
//执行第1组函数
status=1;
break;
case 1:
//执行第2组函数
status=2;
break;
case n-1:
//执行第n组函数
status=0;
break;
}
}
} 学习中 贴子下沉了,我顶上去。 上位机是150ms发送一帧数据,主程序处理时间是500ms,这样岂不是缓冲区来不及处理数据,肯定要溢出? 买本我的书,学习如何根据实际情况设计指定一个适合你实际系统使用的合理的通信规程。 一个任务跑500ms才出来,你程序咋写的。我就不信啥任务不能分解到150ms以下,
我就武断的下个结论,你说的情况完全可以避免出现!!!!!
看你积分还挺高,那得灌多少shui 150ms也太囧了,用状态机,我都是最以1/2/4/8ms为主循环周期在用... 1、通讯接收采用中断+缓冲区的方式
2、通讯解析函数在主程序中执行
3、上位机定时每隔150ms给单片机发送一帧数据
如果主程序的执行时间很长,例如:主程序大约执行500ms,那么通讯质量就不是非常差了吗?
150ms发送一帧数据,这个“一帧”是什么概念?一个字节,还是一个数据包?有多少字节?
既然通讯接收采用中断+缓冲区的方式,那么通讯解析函数需要多少时间?
主程序500ms执行,能否被中断打断一会?如果可以的话,收到“一帧”数据后在中断中就处理掉就行了。
如果必须500MS才能去处理收到的通讯数据,那么处理后返回给上位机一个数据(如正确处理,错误数据等)。此时上位机根据下位机的回答进行下步的处理。上位机不需要150ms发送一次,只是在收到下位机应答后,发送下“一帧”数据(下位机不能及时处理,再多发也无用)。如果上位机发送数据后,500MS后没有收到下位的回答,上位机可重发。3次重发都没有回答,下位机死机、或通信线路断开有问题。
这些在我的书中都有介绍的。
页:
[1]