第21讲自己动手学习单片机系列讲座-USART通讯预案.ppt

第21讲自己动手学习单片机系列讲座-USART通讯预案.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第18讲 USART(48/88/168);1 载波检测 DCD 2 接收数据 RXD 3 发送数据 TXD 4 数据终端准备好 DTR 5 信号地 SG 6 数据准备好 DSR 7 请求发送 RTS 8 清除发送 CTS 9 振铃提示 RI ;MAXIM 202E TTL/RS232电平转换接口芯片;硬件连接图;通讯编码;从机获得主机要求数据的报文,若无错误 将数据打包成报文格式发送给主机,从机数据帧格式如下;1个奇偶校验位,或无奇偶校验位,缺省偶校验 当有校验位时,1个停止位,当无校验位时,两个停止位;void slaverInit( unsigned int baudrate, char parBit ) { /* 设置波特率*/ unsigned int baudReg; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { baudReg = F_CPU/(16*(unsigned long)baudrate)-1; UBRR0 = baudReg; //设置数据位8 switch(parBit) {; case 0://不校验,8位数据位,2位停止位 UCSR0C = 0x0E; break; case 1://奇校验,8位数据位,1位停止位 UCSR0C = 0x36; break; default://缺省偶校验 UCSR0C = 0x26; break; } /* 接收器与发送器使能*/ UCSR0B |= (1RXEN0)|(1TXEN0); } };从机获取主机发送的单个字节数据;mbMsg usartGetFrame() { int i; unsigned int crc1;//计算得到的crc码 unsigned int crc;//数据中包含的crc码 char d[2] = {0,0}; mbMsg msg; //寻找帧起始标记(0x55 0xFF 0xAA),找到帧起始标记退出; while(1) { if(usartGetBin() == 0x55) for(i=0; i2; i++) d[i] = usartGetBin(); if( (d[0] == 0xFF) (d[1] == 0xAA) ) { //写帧头 msg.message[0] = 0x55; msg.message[1] = 0xFF; msg.message[2] = 0xAA; break; } }; msg.message[3] = usartGetBin(); msg.message[4] = usartGetBin(); msg.message[5] = usartGetBin(); crc = msg.message[5]8;//获得高8位crc crc |= msg.message[4];//获得低8位crc crc1 = crc16Fast(msg.message,4,0xFFFF,0x0000); if(msg.message[3]250) //要求的数据超过250个字节,无效帧 { msg.flag = 0; msg.dataSize = 0; usartPutErr(0x01); //超过250个数据,发送错误号0x01 return(msg); }; //CRC校验正确,置位flag标志,表示获得有效帧 if(crc1 != crc)//crc校验不正确,无效帧 { msg.flag = 0; msg.dataSize = 0; usartPutErr(0x02); //校验不正确,发送错误号0x02 return(msg); } else { msg.flag = 1; msg.dataSize = msg.message[3]; //存放要发送的有效数据长度 return(msg); } };/* 发送8位数据给已寻址的设备*/ void usartPutBin(char data) { /* 等待发送缓冲器为空*/ while ( !( UCSR0A (1UDRE0)) ); /* 将数据放入缓冲器,发送数据 */ UDR0 = data; };void usartPutErr(char errNum) { char data[6]; int i;

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档