串口通讯中方式3,第九位RB8总是零

wq88143990   2008-11-10 15:18 楼主
如题.
  不管是在软件上调试(奇校验),还是在硬件上,RB8总是零.比如我发9,RB8==0,发7也是0
  请各位帮帮忙。谢谢
void STR_int(void) interrupt 4 using 2
{  
  if(RI)
  {
    on=0;
    ES=0;
ACC=SBUF;
if(P==RB8)
{
  save=SBUF;
  i++;
}
if(i>=80)
{
  bit1=0;
  bit2=1;
  i=0;
}
RI=0;
ES=1;
on=1;
return;
  }
  if(TI)
  {  
  j++;
if(j>=V)
{
  bit1=1;
  bit2=1;
  j=0;
}
else
{
  _nop_();
  ACC=save[j];
  TB8=P;
  SBUF=save[j];
}
TI=0;
  }
}

回复评论 (22)

你是接收哪里来的数据,如果是PC机来那肯定总是0
点赞  2008-11-10 17:33
你用带奇偶检验位的就有1了。
点赞  2008-11-10 17:47
一般来说哈

单片机和PC通信,不用那个位

还不如自己做个加和校验或是异或和校验来得实在

因为:
1。系统中,单字节通信的可能性很少。基本上都是多字节一帧地发

2。如果真的有干扰,这样的去干扰的办法还不如一整帧做来得实在

3。在系统灵活性上,有了限制,能用通用的就用通用的吧,会体会到它的好处的。呵呵
点赞  2008-11-10 23:31
我只是小流量通讯:一小时一次通讯不超80字节只作记录用;
      
     我是用虚拟串口和Keil捆绑在一起,用串口调试软件调试的,在虚拟通讯下也是零;  
点赞  2008-11-11 09:59
过两天和你一起抓一下这个问题看

偶,好像之前没有太关心这个

谢谢LZ
点赞  2008-11-12 18:45
谢谢。
点赞  2008-11-13 14:59


  1. #include
  2. #include

  3. unsigned char SendBuf = 0;
  4. unsigned char RBuf = 0;
  5. void UARTISR(void) interrupt 4
  6. {
  7.     if (TI)
  8.     {
  9.         TI = 0;
  10.         ACC = SendBuf++;
  11.         TB8 = P;

  12.         SBUF = ACC;
  13.         ;
  14.                
  15.     }
  16.    
  17.     if (RI)
  18.     {
  19.          RI = 0;
  20.                
  21.         if (RB8)
  22.         {
  23.             P1 = 0xff;
  24.         }
  25.         else
  26.         {
  27.             P1 = 0X00;
  28.         }
  29.     }
  30. }


  31. int main()
  32. {
  33.     //定时器波特率:9600,18.432MHz
  34.     TMOD = 0x20;
  35.     TH1 = 0xFB;
  36.     TL1 = 0xFB;
  37.     TR1 = 1;

  38.     //工作方式3
  39.     SCON = 0xD0;
  40.     PCON = 0x00;

  41.     //允许接收及初始化
  42.     REN = 1;
  43.     TB8 = 0;
  44.     RB8 = 0;

  45.     //开中断
  46.     ES = 1;
  47.     EA = 1;

  48.        
  49.    
  50.     while (1);
  51.    
  52.    
  53.     return 0;
  54. }


LZ我这段代码调试通过了的

我用串口助手送入不同的标志位,片子做了不同的响应

能收到那个标志位

发送那边我用软件调试,也OK的


具体你看看你的配置方面的东西
点赞  2008-11-14 17:55
你看我用你的CODE调试的.也是这样.不知道我这里.那里设置不对.我已把调试情况录成了图片.
你看一下.
不好意思.不知道怎样上附图片.你能给邮箱吗.麻烦你看一下.谢谢!!
点赞  2008-11-15 10:53
邮箱:lbing7@gmail.com

那LZ你说说你怎么送进那个标志位的?

你的调试方法,流程是什么?
点赞  2008-11-15 11:43
我已发了.看一下吧.
除了图片上的那些.其它的地方.什么也没设置.
点赞  2008-11-15 12:52
LZ我看到你发的图了

也看了你的串口工具了

呵呵

232口里面的标志位,不是自动生成的

而是通过软件设置(在串口工具里就是手动设置)

你“人工”计算你要发的数据的校验位后

在你的串口工具中:校验位:0DD这一个一拉框里选择对应的值

再发送看

呵呵

如果要改动这个,需要自动地修正这个位

那只能重写串口工具来实现

好像问题就只在这里吧

点赞  2008-11-15 13:29
上面的高手们,你们误导楼主了吧

PC与51通讯RB8不可能全是零啊?!

PC的串口有多种设置的,可以是校验码,也可以发指定码

不然PC与51的多机通讯如何识别地址与数据呀?!

我没用C,所以搞不明白楼主是代码问题,还是设置问题,不敢胡说

只是不想有人被误导“你是接收哪里来的数据,如果是PC机来那肯定总是0”

点赞  2008-11-15 13:39
没误导哈

我都说了,我这边都正常的,可以响应RB8

只是PC上的那个RB8位怎么修改的方式问题

呵呵
点赞  2008-11-15 14:01
你好。你再看一下图。我在串口里已经设置了奇校验。
点赞  2008-11-15 14:19
12楼的前后矛盾。
点赞  2008-11-15 14:27
up
点赞  2008-11-15 14:31
up
点赞  2008-11-15 14:31
引用: 引用 14 楼 qdicao 的回复:
你好。你再看一下图。我在串口里已经设置了奇校验。


换成偶的
点赞  2008-11-15 14:36
也是一样。
点赞  2008-11-15 15:12
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复