永发信息网

单片机串口通讯问题(收发字节数不同)

答案:4  悬赏:10  手机版
解决时间 2021-02-07 13:25
  • 提问者网友:城市野鹿
  • 2021-02-07 06:34
本想用上位机向单片机发送一字节数据,在单片机收到数据后在数据前加一个标号再回发给上位机,结果发送数据给单片机后收到的数据少了一些,请教哪位知道这是怎么回事吗?
谢谢~~~
下面是代码:
///////////////////////////////////////////////////////
#include
#define uchar unsigned char
uchar a,q,i=0;
void main()
{
TMOD=0x20;
TH1=0xF4;
TL1=0xF4;
TR1=1;

EA=1;
ES=1;
SM0=0;
SM1=1;
REN=1;
while(1)
{
while(q==1)
{
ES=0;
SBUF=i;
while(TI==0);
TI=0;
SBUF=a;
while(TI==0);
TI=0;
q=2;
P1=0xFF;
i++;
if(i==255)
{ i=0; }
ES=1;

}

}

}
void Ser() interrupt 4
{
RI=0;
a=SBUF;
q=1;
P1=0x00;
}
////////////////////////////////////////

再问一下,在单片机串口通信中,如果单片机接收来自上位机的数据过快而不能及时处理它时,是否有另一个寄存器来存放未及时处理的数据呢?
谢谢~~~
最佳答案
  • 五星知识达人网友:鸽屿
  • 2021-02-07 08:06
收到数据后,在前面加一个标号再回发给上位机,........
---------------------
一字节数据收到后,随即向上位机发送两个字节,显然上传的量,要大于接收的,时间上肯定不够用。丢失信息是肯定的。
从程序看:
while(q==1)
{
ES=0; //关闭了中断,这就要丢失数据,
…………
有的数据,你没有及时处理,就被后续收到的串行数据,覆盖了。
----------------------
实际的接收程序,是应该在接收机里面,有一个存储队列,把新数据排在后面,并向主程序给出“有了新数据”的标志;
主程序,从队列的起始处,取出数据进行处理,并将队列整体前移,修改指针也可。
全部回答
  • 1楼网友:行路难
  • 2021-02-07 09:56

你说的以上问题大概分两方面!

1 串口通讯问题! rs232只是一个电平转换芯片,硬件接对了就可以像桥梁一样连接单片机和电脑的串口。  只要单片机配置好串口接收发送数据(波特率,奇偶校验,数据位,停止位),电脑的串口调试助手也同样设置就能相互通讯了。不用管它通讯协议。

2 实现电子称读数完全是看软件如何写了!例如你规定电子称接收到一个字符‘a’就发送当前称到的重量给电脑。那么你就能通过调试助手看到电子称上单片机发送来的重量数据。

祝你成功!

  • 2楼网友:拾荒鲤
  • 2021-02-07 09:29
PC机如果不间断发送,单片机接收到数据要给PC机回数据,收到一个回两个,在发送的时候中断被关闭了,就收不到数据了,这就是全双工和半双工的区别,建议你修改一下通讯协议
  • 3楼网友:平生事
  • 2021-02-07 08:17
你发送数据的时候,正好也在接受数据A,当你发完以后,又来了新的数据B,结果你只接收到B,而没有接受到A。如果你一个一个的发,应该就不会出错了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯