打印

PIC16F1939串口接收的问题

[复制链接]
9614|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ldk060|  楼主 | 2011-10-14 19:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ldk060 于 2011-10-20 08:49 编辑

用串口调试助手发送一帧数据给PIC单片机,单片机能否全部把数据接收到,我试了试,怎么接收不全啊?例如发送26 43 51 31 34 30 13 13 11 06 31 31 03  43  04 63 48 06 40 67 48  这一帧数据,单片机能否全部接收到?
我试了试不行,是不是因为串口调试助手字节与字节之间的发送间隔太快导致单片机接收不全(单片机反应速度慢?)
我想,只要串口接收那部分代码执行的时间只要小于串口发数据时位于位之间的时间间隔,为了保险起见,我把波特率设置低一些还是不行。还是不能一次接收完数据。代码如下:
#include  <pic.h>
#include   <math.h>
#include   <stdio.h>
__CONFIG(FOSC_INTOSC&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_ON&BOREN_OFF&IESO_OFF&FCMEN_OFF);
__CONFIG(WRT_ALL&PLLEN_OFF&BORV_25&LVP_OFF);

uchar i,Num=0,Rx[5];   
void  interrupt Rcv()

      if(RCIE&&RCIF)
      {
              Rx[Num]=RCREG;
              if(OERR){CREN=0;CREN=1;}
              Num++;
              if(Num==5)
               {
                 Num=0;
                Com_Flag=1;
               }
       }

main()

     OSCCON=0x70;//IRCF0=1;
     RCSTA=0XC0;  /*允许串行口工作*/
     TXSTA=0X44;   /*选择异步高速方式传输9位数据*/
     BRGH=1;
     SPBRG=51;  /*将传输的波特率设为约9 600位/秒25*/
     TXEN=1;
     CREN=1;
     RCIE=1;
     PEIE=1;     //外围中断允许
     while(1)
     {
              if(Com_Flag==1)
             {
                   Com_Flag=0;
                   for(i=0;i<5;i++)
                  {            
                     while(1){if(TXIF==1) break;} //等待写入完成
                     TXREG=Rx_Dat[  i ]
                  

              }
      }


接收数据不正确,不知是哪的问题,请帮忙看下啊
沙发
yewuyi| | 2011-10-14 21:36 | 只看该作者
如果是PC发给MCU,如果MCU的UART响应速度不够,则可能产生丢包,响应速度不够有很种可能,如下:
1、PC的UART波特率过高,超过了MCU硬件所能承受的极限,则会产生丢包
2、虽然PC的UART波特率速度不是很快,但因为MCU的代码造成接受阻塞,则也会产生丢包
3、PC发送的速度适当,MCU的代码响应速度也没问题,但代码有BUG并造成接受的数据被覆盖,则也会可能产生丢包。
4、其它还有很多种可能,但以上3条是比较常见的。

使用特权

评论回复
板凳
asspeed| | 2011-10-14 21:49 | 只看该作者
验证很容易:

将同样数目同样内容的数据以手动的方式依次发送,然后再看结果就知道数据接收的处理是否工作正常。

使用特权

评论回复
地板
ldk060|  楼主 | 2011-10-14 22:50 | 只看该作者
我要写一个通讯协议,然后用串口助手发送命令帧如上图。是不是一般情况下单片机不能够及时响应啊?

使用特权

评论回复
5
ldk060|  楼主 | 2011-10-14 22:56 | 只看该作者
:(在线等啊,不解决这问题不想去睡觉去

使用特权

评论回复
6
ldk060|  楼主 | 2011-10-14 23:00 | 只看该作者
怎么调试才行啊

使用特权

评论回复
7
virtualtryon| | 2011-10-14 23:38 | 只看该作者
开辟32字节的一维数组做为缓存.
在RX中断中,将串口数据送于数据缓存中.
在主程序中,处理数据缓存中的数据,进行解帧.
把你的程序发上来.

使用特权

评论回复
8
ldk060|  楼主 | 2011-10-17 18:21 | 只看该作者
谁帮忙解决一下啊?

使用特权

评论回复
9
ldk060|  楼主 | 2011-10-17 18:27 | 只看该作者
我把代码贴上来了,别光看,不回复啊:dizzy: 版主在吗?帮帮忙啊

使用特权

评论回复
10
ldk060|  楼主 | 2011-10-17 19:47 | 只看该作者
在线等:(

使用特权

评论回复
11
asspeed| | 2011-10-17 21:08 | 只看该作者
这个代码怎叫一个乱哦,中断函数这样写,主函数这样写,用一堆的di,ei,while,就这种代码,运行结果对了都不敢用,这种写法你还用中断干啥?轮询就得了呗。

使用特权

评论回复
12
ldk060|  楼主 | 2011-10-17 21:26 | 只看该作者
我目前正在写通讯协议,di ei 是为了在串口接收命令令帧是防止别中断再次产生才加上去的。while 是在接收到一帧数据的起始位时在开始进行的,我没把具体的协议程序写进来,只是摘抄了其中的一部分。乱确实有些乱,但是我感觉也不至于让串口调试助手发十六进制数11 22 33 44 55 66 单片机确接收不这正确啊,找不出代码的问题来,请指教!

使用特权

评论回复
13
ldk060|  楼主 | 2011-10-17 21:29 | 只看该作者
上面代码是为了验证,从串口中断接收5个十六进制数,然后让主程序里再把接收的数据发到串口调试助手,但是结果不正确。

使用特权

评论回复
14
yewuyi| | 2011-10-17 22:08 | 只看该作者
请先弄清楚PIC16的中断结构再写程序。代码早已看到,但实在看不下去啊。
PIC16的中断结构不支持中断嵌套,所以在中断函数中随便操作GIE是极为危险的行为,没有特殊情况,请勿采取此危险行为,即使确有必要,也需要自己用代码去做相应的中断嵌套的现场保护行为,否则死翘翘。
PICC16在MCU响应进入中断后,中断处理器会自动关闭GIE,并在退出中断时恢复GIE,请勿用代码再操作它。
另外,在主函数中随意的打开和关闭GIE,也是和中断函数会产生冲突的。

使用特权

评论回复
15
XIEYUANBIN| | 2011-10-18 08:06 | 只看该作者
也有可能波特率不对,波特率不对可能收到误码;
或者数据溢出,数据溢出需要清掉错误标志才能继续接收。
发送方法不对,发送时应检测TX BUFFER是否空,并且TXIF是否置位,这样丢进去的数据才不会丢失。
你可采用接收一个字节之后立即发送回去,减少中间环节以判断是否是你程序处理速度太慢导致丢失数据。
原则上,收到数据并且将数据处理完毕的时间控制在接收一个字节的时间的1/2之内就可以可靠接收数据。

使用特权

评论回复
16
ldk060|  楼主 | 2011-10-18 08:51 | 只看该作者
14楼版主你好,在针对我提出的问题而言,中断应该不是引起接收发送不正确的原因。 15楼版主你好,发送之前我已经检测TX BUFFER是否为空了啊,波特率设置为9600,我上面接收部分的代码执行时间应该是小于100us的,接收不正确是不是因为串口助手发送方式不对呢如图

使用特权

评论回复
17
asspeed| | 2011-10-18 09:34 | 只看该作者
void  interrupt Rcv()
{
  
    if(RCIE&&RCIF)
    {     
      TXREG=RCREG;
     }
  }
void main(void)


  OSCCON=0x70;//IRCF0=1;
   RCSTA=0X80;   /*允许同步串行口工作*/
   TXSTA=0X04;   /*选择异步高速方式传输9位数据*/
  BRGH=1;
   SPBRG=51;  /*将传输的波特率设为约9 600位/秒25*/
TXEN=1;
CREN=1;
RCIE=1;
PEIE=1;     //外围中断允许
GEIE=1;
  while(1)
{
   CLRWDT();
}
               



使用特权

评论回复
18
yewuyi| | 2011-10-18 12:35 | 只看该作者
8207414楼版主你好,在针对我提出的问题而言,中断应该不是引起接收发送不正确的原因。 15楼版主你好,发送之前我已经检测TX BUFFER是否为空了啊,波特率设置为9600,我上面接收部分的代码执行时间应该是小于100us的 ...
ldk060 发表于 2011-10-18 08:51


请先弄懂PIC16的中断结构!!!

请问你去弄懂了吗!?

使用特权

评论回复
19
ldk060|  楼主 | 2011-10-18 18:59 | 只看该作者
谢谢大家的热心帮助,问题解决了,是因为我串口调试助手设置错了,停止位设置为2就正确了

使用特权

评论回复
评分
参与人数 1威望 -1 收起 理由
yewuyi -1 强烈反对
20
virtualtryon| | 2011-10-19 08:26 | 只看该作者
LZ的程序会把人吓坏的。
绝对不会是串口调试助手设置错了的问题。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yewuyi + 1 我很赞同
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

344

帖子

0

粉丝