求助UART串行接口 点击:1189 | 回复:13



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-07-01 15:55:00
楼主
请问各位高手,单片机中有没有UART这个串行接口电路呢?是不是RXD就是UART的,如果是,如何来判断发来数据的校验码是正确的呢?谢谢!!



GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-27 17:24:00
1楼
各厂家的单片机都不一样, 您得查规格书才知是否有内建 UART. 若是有内建 UART, 则其 parity check 应该是在 UART 里面就处理掉了, 您所取得的数据就是您要的 data 了. 但 UART 无法保证每个 byte 都是正确的. 若要确保数据的正确性, 您还得对整个数据提供一些检查运算. 例: 在发送端计算 data checksum, 并附在 data 最后面. 再由接收端对收到的 data 再次作 checksum 计算, 并与收到的 checksum 作比对, 看看两边计算的是否一致. (checksum ==> 将每个 byte 累加) 若要再精确的话, 您就得查一下 CRC16, CRC32 这类的检查算法了.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-06-29 16:35:00
2楼
谢谢楼上的glaylin兄,希望能告之如何实现每个byte的累加,在c51通过rxd接受到的数据是存放在sbuf中的,但sbuf寄存器不能实现位操作,那如何累加每一个byte位呢?还有是不是通过事先定好的接受数据的格式来确定校验位的?这个语句是什么呢?否则,如何使校验位不被误认为是数据位?比如一个数据7,用奇数校验,那它的数据格式为0000011101,第一个0为起始位,后面7个为数据位,倒数第二个0为奇校验位,最后一个为停止位,如果没有UART该如何提取0000111,并且使奇校验位0不被误认为是数据位0,如果有UART,那传输中如果有差错是校验位发生错误,该如何得知?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-29 18:22:00
3楼
1. Sorry! 没跟您说清楚. 不论是 checksum, CRC16 或是 CRC32; 这些都是在 Application Layer 在处理的. 底层或是 UART 都是不管这些的. 这属于通信协议的一部份. 2. 若有 UART, 则您需明确的对 UART 作通信格式 (例: 8N1) 的设定. UART 才能依您的需求取出数据. 而通信格式又依两边的通信协议而定. (两边都同意使用的格式/协议.... 若是两边的定义不一样.... 那就鸡同鸭讲了!) 3.若没有 UART, 一样囉, 您得依照两边同意的通信格式来分析/取出您要的数据. 总之, 不论有或没有 UART, 您都得先知道两边都同意的通信格式才行.

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-29 18:23:00
4楼
4. Parity check 应该只有一个 bit 吧! 5. 若是使用 Even Parity check, ( 去头去尾, 不谈 start/stop bits, parity check 好像不含这部份.). 若 dataA 为 0101 0010, 则因为 dataA 中有 3 个 1, 所以 parity bit 要设为 1, 使其总数为偶数个 1. ( 0101 0010 1 ) 若 dataB 为 0011 1100, 则因为 dataB 中有 4 个 1, 所以 parity bit 要设为 0, 使其总数为偶数个 1. ( 0011 1100 0 ) 相反的, 若使用 odd parity check, 则需使其 1 的总数维持为奇数个.

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-29 18:26:00
5楼
6. 检查时, 就依使用的是 even or odd parity check, 来计算 data & parity bit 之中的 1 的总数, 看看是否相同于我们要的偶数个 或是 奇数个. 例: even parity check dataA 0101 0010 1 ==> 有偶数个 1, OK dataB 0011 1100 0 ==> 有偶数个 1, OK 若通信受干扰, 各有一个 bit 有错误时... dataA 0100 0010 1 ==> 有奇数个 1, 错误, 我们要求有偶数个才行 dataB 0011 1100 1 ==> 有奇数个 1, 错误, 我们要求有偶数个 1 才行 若通信受干扰, 各有 2 bits 有错误时... dataA 0100 0000 1 ==> 有偶数个 1, 无法查出错误 dataB 0010 1000 0 ==> 有偶数个 1, 无法查出错误 7. parity check 发现错误时, uart 会要求对方重新发送吗? I donot know! 又因 parity check 只能用于 1 bit 以下的错误检查, 所以其实用途不大, 甚至少用 (所以我们常用 8N1, 8 data bits, No parity check, 1 stop bit). 也因此会有 checksum, CRC16, CRC32 ... 等的检查方法出现.

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-29 18:35:00
6楼
sorry! 前文无法一次 post, 后来发现问题出在前文中有用到一个 单引号... ccc

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-06-30 09:53:00
7楼
谢谢您,上面您所说的奇偶校验我知道,我也知道用处不大,但老师希望那样,所以,哎,我很无奈啊,我现在是想了解,如何在单片机接受到数据后,把数据的每一位相加而得出是奇数个1还是偶数个1,例如, dataA 0100 0000==》checksum=0+1+0+0+0+0+0+0=1所以有一个1,其奇数校验为0 dataB 0010 1000==》checksum=0+0+1+0+1+0+0+0=2所以有2个1,其奇数校验为1 我想通过计算出单片机的checksum和发送时PC的checksum,让它们做比较,如果相同就认为传输正确,不同就认为传输错误需要重发。 需要解决的问题是,如何来实现单片机收到的数据每一位的相加,因为sbuf不可以位寻址,所以在单片机中我不知道如何让0+0+1+0+1+0+0+0这样的数据位相加实现。 呵呵,我好象说的很罗嗦,不知道我有没有表达清楚我的意思

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-06-30 10:45:00
8楼
您要的是这个吗....? count = 0; for (int i=0; i<8; i++) { if ( (dataA >> i) & 0x01) count++; } count == bit 为 1 的总数.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-07-01 13:30:00
9楼
恩,对的,呵呵,您好厉害,我就没有想到,但可以用汇编吗?您有没有用vc6.0++的mscomm控件编的带校验的串行发送程序吗?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-07-01 13:47:00
10楼
汇编是什么意思? Assembly ? parity check 是通信格式的一部份, 且是在 UART 中就被处理掉的, 而 mscomm 是 application layer 的软件, 不能对通信格式作后续处理. 您只能(且必需)设定 mscomm 中的 通信格式(baudrate, data bits, parity check mode, stop bits). mscomm 会将设定值转交给 driver 层, 再由 driver 去设定 UART 的通信格式.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-07-01 15:25:00
11楼
恩,我明白了,十分感谢您的解答 呵呵,您好厉害啊,小弟真是佩服的五体投地,我在数据通信方面还有很多不懂,希望能常常请教您,您能告诉我您的OICQ 或者ICQ吗?可以发到我的EMAIL信箱里

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-07-01 15:55:00
12楼
Sorry! 我没有使用 ICQ 的习惯. 我会的也只有那么一点而已. 若是您还有任何相关的问题, 您可以往工控网上丢, 让更多人可以帮您.

IIIBEE

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:39
  • 注册:2011年3月17日
发表于:2011-04-18 10:16:36
13楼
ZYWYN RS232/485接口器件,Pin-to-Pin替换MAXIM,SIPEX等

1、ZYWYN RS232/485接口器件,Pin-to-Pin替换MAXIM,SIPEX等.同等性能价格优势明显.

2、System Base串口扩展,串口联网服务器.扩展转换IC,串口服务器开发平台.

中国大陆地区代理商
QQ:[285]*[44]*[0741]
手机:①③[7]-②⑧⑥[0]-②④⑨[5]


热门招聘
相关主题

官方公众号

智造工程师