打印

串口如何收发多字节

[复制链接]
6010|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbdxzn|  楼主 | 2012-9-2 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PC通过串口助手向单片机发送aa 01 02 dd指令,如果单片机收到第一个字节为aa后就原样返回四个字节的数据
#include<reg52.h>
unsigned char flag;
unsigned char ch[4];
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
EA=1;
ES=1;
PS=1;
TR1=1;
}
void rec() interrupt 4
{
unsigned char i;
if(RI)
{
  RI=0;
  ch[i]=SBUF;
  i++;
  if((i==4)&&(ch[0]==0xaa))
   {
    flag=1;
i=0;
   }
}

}
void send(unsigned char a)
{
SBUF=a;
while(TI==0);
TI=0;
}
void sendN()
{
unsigned char j;
  ES=0;
for(j=0;j<10;j++)
{
  send(ch[j]);
}
ES=1;
}
void main()
{
init();
while(1)
{
  if(flag==1)
   {
    sendN();
flag=0;
   }
}
}

这是我 写的程序,可是发送指令后,接收区 没反应。不知道怎么回事,请指点一下

相关帖子

沙发
阿南| | 2012-9-2 17:52 | 只看该作者
楼主,可以分步骤去调试。
一。先测试你的发送程序,即用单片机向PC机发送,查看PC机是否接收正常,此时不一定是你程序的问题,可能是硬件问题,如串口线反了,使用的是直连线还是交叉线等。
二。再测试你接收程序,即PC机向单片机发送是否可以正确接收到你想要的数据。
三。最后再统调你的接收发送程序。

使用特权

评论回复
评论
hbdxzn 2013-1-10 15:15 回复TA
有道理 好好学习 
板凳
airwill| | 2012-9-2 20:26 | 只看该作者
"发送指令后,接收区 没反应。"
这个问题的可能性很多. 楼上已说了很多.
从另一个角度来说, 给楼主个建议, 要多学习一些调试的技巧.

使用特权

评论回复
地板
ningling_21| | 2012-9-2 23:21 | 只看该作者
有个建议,LZ先画出你要的程序的流程图,再根据流程图写程序。
有时候程序出了问题,是因为思路不清晰,也就是流程图不清晰...

使用特权

评论回复
5
高个| | 2012-9-3 00:49 | 只看该作者
楼主,你的接收程序有问题,
定义的自变量i,在每次中断调用的时候都会重新定义一次,如果C语言对没有赋初始值的变量默认值为0的话.
你这个i每次定义都会是0.也就是说.你的单片机调用了REC()函数四次,每次接收的数据都存放在ch[0]中.所以也不会有下文的单片机发送到PC

使用特权

评论回复
6
dlyt_test001| | 2012-9-3 08:56 | 只看该作者
楼主,可以分步骤去调试。
一。先测试你的发送程序,即用单片机向PC机发送,查看PC机是否接收正常,此时不一定是你程序的问题,可能是硬件问题,如串口线反了,使用的是直连线还是交叉线等。
二。再测试你接收程序, ...
阿南 发表于 2012-9-2 17:52


调度技巧很重要!

使用特权

评论回复
7
joyme| | 2012-9-3 10:01 | 只看该作者
5楼正解,需要用全局变量或静态变量做索引

使用特权

评论回复
8
hbdxzn|  楼主 | 2012-9-3 17:50 | 只看该作者
把i改成全局变量后也是不行,我想验证语句改成
if((i==4)&&(ch[0]==0xaa)&&(ch[1]==0x01)&&(ch[2]==0xbb))
{
    i=0;
  flag=1;
}
就返回。这样还不行。可是改成if((i==4)&&(ch[0]==0xaa)&&(ch[1]==0x01))这样能看返回数据。为什么改成判断三个字节就不行了呢???求指教




5# 高个

使用特权

评论回复
9
高个| | 2012-9-3 21:59 | 只看该作者
因为你程序写错了.你发送的是aa  01  02  dd.
判断语句写bb.怎么可能通过?

使用特权

评论回复
10
hbdxzn|  楼主 | 2012-9-4 08:32 | 只看该作者
因为你程序写错了.你发送的是aa  01  02  dd.
判断语句写bb.怎么可能通过?
高个 发表于 2012-9-3 21:59

我在楼上写的更改语句是我又重新写了一个发送三字节的程序,我现在发送aa 01 bb,刚开始不返回,然后我第二天早上有发了一次倒是可以返回了。就是有一个问题:把单片机断电后,在重新上电,此时不关串口助手,就不能返回数据;当我把串口助手关了在重新打开,这样就能返回。不知道怎么回事??还有就是有时候会丢包,这是不是程序哪里没写好?请问怎么写啊

使用特权

评论回复
11
hbdxzn|  楼主 | 2012-9-4 08:35 | 只看该作者
硬件接线应该没问题,我发一个字节然后返回,这个可以正常工作;发多个字节(不加判断时)也可以返回。问题是当我加上if语句里的判断时就不返回了,这是哪里的问题啊??
2# 阿南

使用特权

评论回复
12
wangyy608| | 2012-9-4 09:12 | 只看该作者
接收没办法同步,可以加一个超时判断把i清0;
波特率,你在接收之后加了1个判断,这样如果波特率比较快就会有问题

使用特权

评论回复
13
popk970| | 2012-9-4 10:00 | 只看该作者
用状态机写吧

使用特权

评论回复
14
wangxm86| | 2012-9-4 10:14 | 只看该作者
if((i==4)&&(ch[0]==0xaa))
怎么括号还是中文的?不报错?

使用特权

评论回复
15
hbdxzn|  楼主 | 2012-9-4 10:23 | 只看该作者
您看的很仔细,谢谢。这个是我后来手写到帖子上的。程序里是英文
14# wangxm86

使用特权

评论回复
16
hbdxzn|  楼主 | 2012-9-4 10:25 | 只看该作者
应该怎么写这个超时判断啊??还有写在哪??菜鸟求明教
12# wangyy608

使用特权

评论回复
17
wangxm86| | 2012-9-4 10:30 | 只看该作者
for(j=0;j<10;j++)
{
  send(ch[j]);
}
会不会是你只定义了CH[4];但是你这里都到ch[9]了,造成的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝