打印
[新唐博主]

N76E003 串口奇偶校验怎么设置啊?

[复制链接]
1592|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
十有八九1212|  楼主 | 2019-5-28 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
{
                P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
    SCON |= 0xd0 ;            //UART0 Mode2,REN=1,TI=1
    TMOD |= 0x20;            //Timer1 Mode1
         // set_SM2;
       
   set_RB8;
          set_TB8;
    set_SMOD;                //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;                //Serial port 0 baud rate clock source = Timer1
         //AUXR1 |=0X04;
#ifdef FOSC_160000
     TH1 = 256 - (1000000/u32Baudrate+1);             /*16 MHz */
#endif           
#ifdef FOSC_166000
    TH1 = 256 - (1037500/u32Baudrate);                              /*16.6 MHz */
#endif
           clr_TI;
    set_TR1;
                set_TI;                                                //For printf function must setting TI = 1
}

使用特权

评论回复
沙发
tianxj01| | 2019-5-28 09:09 | 只看该作者
采用模式2
数据由起始位(逻辑0),8位数据(最低位在前),第9位数据(TB8或RB8)和停止位(逻辑1)组成。第9位做奇偶校验位或多机通信时用来区数据和地址。
这里第9位数据必须软件计算产生,然后填上或者读出来,数据在SCON中的TB8、RB8。

使用特权

评论回复
板凳
十有八九1212|  楼主 | 2019-5-28 09:13 | 只看该作者
tianxj01 发表于 2019-5-28 09:09
采用模式2
数据由起始位(逻辑0),8位数据(最低位在前),第9位数据(TB8或RB8)和停止位(逻辑1)组成。第 ...

void R8209C_uart0_send(char * buf , unsigned int count)
{
    UINT8 i=0;
          TI=0;
        //ACC=buf;
         TB8=P;
         // set_P01;
                for(i=0;i<count;i++)
                {  
                                  SBUF = buf;
                           
                                        while(!TI);
                }
       
                //clr_P01;
}

使用特权

评论回复
地板
十有八九1212|  楼主 | 2019-5-28 09:14 | 只看该作者
tianxj01 发表于 2019-5-28 09:09
采用模式2
数据由起始位(逻辑0),8位数据(最低位在前),第9位数据(TB8或RB8)和停止位(逻辑1)组成。第 ...

是不是这样?我设置的是模式3?发送的时候TB8=P?

使用特权

评论回复
5
tianxj01| | 2019-5-28 09:26 | 只看该作者
十有**1212 发表于 2019-5-28 09:14
是不是这样?我设置的是模式3?发送的时候TB8=P?

发送时候,TB8=发送数据奇偶校验运算结果
接受时候,接受数据奇偶校验数=RB8。
有个疑问,你是用做熟悉模式应用呢还是做实际用,事实上,现在很少有只是采用奇偶校验来保证数据完整性的做法,串口通信因为波特率误差、干扰等因素,发生误码相对比较常见,奇偶校验在很多时候,是无法正确识别出误码的,为了确保数据完整性,一般都是通过编制单独的数据包格式+校验数据,作为一个完整包接收或者发送,然后集中处理,完了有误码就让重新发送。校验数据则至少是校验和,位异或或者CRC。

使用特权

评论回复
6
十有八九1212|  楼主 | 2019-5-28 10:20 | 只看该作者
tianxj01 发表于 2019-5-28 09:26
发送时候,TB8=发送数据奇偶校验运算结果
接受时候,接受数据奇偶校验数=RB8。
有个疑问,你是用做熟悉模 ...

因为这个是跟其他芯片通讯,必须是偶校验。谢谢了

使用特权

评论回复
7
十有八九1212|  楼主 | 2019-5-28 11:18 | 只看该作者
十有**1212 发表于 2019-5-28 10:20
因为这个是跟其他芯片通讯,必须是偶校验。谢谢了

这个数据奇偶校验位是怎么计算出来的呢?最后计算结果是P?TB8=P?

使用特权

评论回复
8
小灵通2018| | 2019-5-28 11:28 | 只看该作者
结合手册以及奇偶校验的知识。

使用特权

评论回复
9
tianxj01| | 2019-5-28 18:12 | 只看该作者
本帖最后由 tianxj01 于 2019-5-28 18:26 编辑
十有**1212 发表于 2019-5-28 11:18
这个数据奇偶校验位是怎么计算出来的呢?最后计算结果是P?TB8=P?


所谓奇偶校验,就是发送或者接收数据,1的个数,奇校验,则包括校验位在内,1的总个数为奇数,反之则为偶数。
按偶校验为例,FF,则为8个1,为偶数个1,则校验位就为0,而如果发送1F,则1的个数是5,为奇数个1,则校验位为1。
实际操作:
发送数据,奇校验的,校验位=原数据屏蔽高7位后,测试最低位,如果是1,则校验结果寄存器+1,然后源数据右移1次,for循环右移总共测试8次,完成所有低位测试,最后校验寄存器数据 除2求余,结果为0的,就是偶数个1,结果为1的,为奇数个1,剩下的按照奇校验还是偶校验要求填入校验位就可以了。
该函数,在发送和接受时候,不管奇校验还是偶校验,都是可以通用的,只是最后得到结果,处理方法不一样而已。
软件奇偶校验方法还有很多,原则知道了,怎么方便怎么写吧。

至于51系列,PSW中的P可以表达累加器A中“1”的个数的奇偶性,处理起来就非常简单。
ACC=发送数据(8位)
校验结果就=P。

使用特权

评论回复
10
externally| | 2019-5-29 20:25 | 只看该作者
奇偶校验是一种相对简单的校验方法,看说明就可以了解了

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝