[技术问答] 赛元官方能不能提供一个串口奇偶校验的例程

[复制链接]
231|14
 楼主 | 2019-10-26 11:11 | 显示全部楼层 |阅读模式
本帖最后由 taobaofarmer 于 2019-10-26 11:12 编辑

包括发送奇偶位的实现和接收奇偶位的识别判别,如果真的无法实现,那赛元就给出一个肯定的结论,这个需求很旺盛,客户必须要求,赛元能不能接点儿地气考虑下百姓的需求,理解下民间的疾苦?

使用特权

评论回复
 楼主 | 2019-11-5 14:53 | 显示全部楼层
赛元对这个问题没兴趣吗?

使用特权

评论回复
 楼主 | 2019-11-11 17:25 | 显示全部楼层
赛元的沉默表示什么意思?

使用特权

评论回复
| 2019-11-12 09:33 | 显示全部楼层
taobaofarmer 发表于 2019-11-11 17:25
赛元的沉默表示什么意思?

没有这个例程,可以在网上找一下

使用特权

评论回复
 楼主 | 2019-11-13 12:01 | 显示全部楼层
赛元为何没有兴趣写这个例程呢?估计需求的人远不止我一个

使用特权

评论回复
| 2019-11-13 15:38 | 显示全部楼层
奇偶校验很少用到吧,反正我到现在都没听到谁用过,一般都是用无校验的居多。当初学8051的时候就没觉得它有什么用,还不如应用层做校验和,比如说通讯过程多了2个干扰,最终奇偶校验结果还是一样,但值已经不对了。你要实现这个功能,可以看看早期的8051UART的模式3都是这么定义的(不带硬件的奇偶校验功能),描述为可编程的数据第9位,至于怎么利用这个第九位就看各自需求咯。比如说利用它来做奇偶校验,则需要利用到系统寄存器 奇偶标志位P,你就先把要发送的值给 ACC= senddata;TB8 = P;(偶校验就是TB8 =~P);然后sbuf = senddata;当然要先设置成模式3;接收也是同理,接收到数据后把ACC = SBUF; 然后if(P== RB8)(偶校验就反一下判断);

使用特权

评论回复
 楼主 | 2019-11-14 10:52 | 显示全部楼层
奇偶校验用的是很少,但是如果做的项目多了肯定会遇到非用不可的,你没遇到是因为你做的项目还不够多

使用特权

评论回复
| 2019-11-14 18:22 | 显示全部楼层
刚就花了几分钟随便写一下,试了奇校验的发送,OK的,示波器可以抓到校验位;我就不明白了,你说你自己做”项目做那么多“,这么简单的程序非得要例程,上网随便百度一下不来得更快吗? 另外用过奇偶检验就做的项目多了?没用过就少了?滑稽。
void Uart_SendByte(uchar byte)
{
       //奇校验
        #ifdef   __UART0__        //使用UART0
                  ACC =  byte;
                  TB8 = P;
                  SBUF = byte;
                  while(!UART_Flag);
                  UART_Flag = 0;       
                  
      #else                  //使用UART1       
                  ACC =  byte;
                  if(P)
                  {
                         US1CON0 |= 0X08;
                  }
                  else
                  {       
                         US1CON0 &= ~0X08;
                  }
                  US1CON3 = byte;
                  while(!UART_Flag);
                  UART_Flag = 0;
          #endif                    
}
246695dcd29257a423.png

使用特权

评论回复
 楼主 | 2019-11-17 10:12 | 显示全部楼层
发送的奇偶校验是很容易实现的,你把接收的奇偶校验实现下试试?

使用特权

评论回复
| 2019-11-18 15:40 | 显示全部楼层
我刚试了奇校验,发送和接收都可以,不过有一个点要注意,之前没怎么用过查资料才知道,ODD奇校验,当数据里的1个数位奇数时,校验位为0;而PSW里面的P寄存器是 ACC里面数据1的个数为奇数时为1;所以要取反一下判断。程序里面上位机发什么数,MCU就回什么数,用工具和示波器看发0x55和0x51都是正常的。
923325dd24885d686b.png
69245dd2493384fc8.png
320695dd24a6dcd0a3.png
151315dd24aa8c8773.png

使用特权

评论回复
 楼主 | 2019-11-18 23:32 | 显示全部楼层
比如你现在本机是奇校验或者偶校验,对方发过来的数据是偶校验或者奇校验,那么这种情况你能识别出校验位是否正确是吧?

使用特权

评论回复
| 2019-11-19 09:32 | 显示全部楼层
两机建立通讯的前提是双方通讯协议要一致;如果你不知道对方是奇校验还是偶校验,你自己可以根据接收的数据和校验位来识别是奇校验还是偶检验,(因为这种做法奇偶校验是全靠软件来判断)当然也不能说根据一个数就确定奇偶,因为这个数据可能是错的,可以根据多个Byte确定当前通讯时奇校验或者偶校验

使用特权

评论回复
 楼主 | 2019-11-19 10:09 | 显示全部楼层
本帖最后由 taobaofarmer 于 2019-11-19 10:15 编辑

“两机建立通讯的前提是双方通讯协议要一致”单看这一句话就是不对的,我的主机下面挂了N个厂家的产品,协议都是不同的,不止是我的现场,实际上好多用户好多现场的情况就是双方或多方之间有几种不同的协议但都挂在一条总线上通信,我原来用的是STM8和STM32,它们在串口的硬件机制上就提供了制造奇偶校验和识别奇偶校验的功能,在接收到每一个字节的时候都能立马识别出是否存在帧错误和奇偶校验错误,附图是我在STM8下接收数据的程序,很简单,像51这种没有硬件识别奇偶校验错误和帧错误的MCU,如果本机是无奇偶校验方式,收到的数据是带奇偶校验的数据,或者本机是奇校验(偶校验),收到的数据是带有偶校验(奇校验)的数据,这在软件上有办法处理吗?我觉得没有办法处理,这种功能应该是在硬件上实现,串口在接收到起始位之后就判断8位数据位之后是否带有奇偶校验位或者是无校验位,然后给出寄存器标识,STM8和STM32就有这种机制,导致编程的时候在接收到单个字节的时候就能立马排除校验不同的数据,另外顺便问你个问题,为何在我附图里的串口接收函数里,要加上帧错误这个判别语句呢?
无标题.jpg

使用特权

评论回复
| 2019-11-19 15:41 | 显示全部楼层
1、“两机建立通讯的前提是双方通讯协议要一致”这句话我不知道你是怎么理解的,你可以说我同时会讲中文和英文,你可以用这两种语言和我沟通,在你说出第一个词我就知道你是说那种语言,因为我掌握中英文的词汇和语法,但你不能用非洲话和我沟通;同样我只会说普通话,你也不能和我用粤语沟通;不能说我本机就设置的是奇校验,而从机的一直是偶校验,要求双方能正确收发数据;只有两边变成一样的设置大家才能通讯正确交互数据。
2、51没有帧错误检测,所以本机设置无校验,而对方是带奇偶校验的方式,本机可能会接收不到数据,本要去接收到停止位的而因校验位的存在,帧不完整,接收数据错误;带帧检测的芯片,对于这种情况当校验位是0时,会触发帧错误;
3、本机设定的是奇校验(偶校验同理)可以进行校验;如当对方的协议是偶校验,发送了偶校验数据0x55+0;此时本机接收校验位,接收到的是0;再进行软件奇校验,校验结果错误(本机按照奇校验要正确是0x55+1);此时可以认为对方是奇校验模式但数据因通讯有噪声而出错;也可以认为对方是用的偶校验的方式,然后本机切换成偶校验去正确接收,但最好是多接收几byte确定对方是奇是偶校验再切;对于不同数据校验位恒为1的也可以认为对方是无校验模式切换成无检验模式;但最终两边要交互上还是要是一样的协议。
4、你的程序里面加入帧检测,是为了知道停止位是否正确接收,停止位出现异常的情况有 波特率不一致;通讯中出现噪声;收发帧格式不一致等。

使用特权

评论回复
 楼主 | 2019-11-20 10:00 | 显示全部楼层
所以我认为赛元的8051要实现STM8中的奇偶校验检测和帧错误检测,靠软件方式是无法完全实现的,这块儿我准备放弃了

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表