- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话: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 RS-232C接口定义(9芯)及电平 在TxD和RxD上: 逻辑1 -3V~-15V 逻辑0 +3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压)=-3V~-15V MAXIM 202E TTL/RS232电平转换接口芯片 电路连接好后,通上5v电源,可检查引脚2和引脚6,用万用表测量2脚电压为9v,测量6脚电压为-9v 硬件连接图 注:只使用一组端口时要对应使用。例如只使用第一路232端口,必须R1OUT,T1IN对应 R1IN,T1OUT使用,否则容易烧掉MAX202芯片 红色一组 绿色一组 通讯编码 232通讯为“主-从模式”通讯,线路上只有一个主机,一个从机。通讯时传送数据需要遵循一定的规则,根据规则,主机从机从报文中获得有效数据。约定以下通讯方式,(也可以规定自己的通讯方式) 主机要求数据,从机才能发送,不要求数据,从机不能发送。主机要求数据的报文格式如下 从机获得主机要求数据的报文,若无错误 将数据打包成报文格式发送给主机,从机数据帧格式如下 注:报文中数据长度N≦250 通讯中传送的每个字节的格式规定如下(11位) 1个起始位 8为数据位 1个奇偶校验位,或无奇偶校验位,缺省偶校验 当有校验位时,1个停止位,当无校验位时,两个停止位 若从机收到数据后有错误,发送错误帧给主机 0x01:表示主机要求的数据个数大于250个字节 0x02:主机发来的消息帧CRC错误 0x03-0xFF:用户定义 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) { 从机初始化完成以下工作 设定波特率;设定数据位8位; 设定校验位;设定停止位。 case 0://不校验,8位数据位,2位停止位 UCSR0C = 0x0E; break; case 1://奇校验,8位数据位,1位停止位 UCSR0C = 0x36; break; default://缺省偶校验 UCSR0C = 0x26; break; } /* 接收器与发送器使能*/ UCSR0B |= (1RXEN0)|(1TXEN0); } } 从机获取主机发送的单个字节数据 /*接收地址或数据*/ static char usartGetBin( void ) { int resh; /* 等待接收数据*/ while ( !(UCSR0A (1RXC0)) ); /* 从缓冲器中获得数据*/ resh = UDR0; /* 返回*/ return (resh); } mbMsg usartGetFrame() { int i; unsigned int crc1;//计算得到的crc码 unsigned int crc;//数据中包含的crc码 char d[2] = {0,0}; mbMsg msg; //寻找帧起始标记(0x55 0xFF 0xAA),找到帧起始标记退出 获取主机发送的完整帧,存放于mbMsg结构中。 若主机要求超过250个字节,发送错误号0x01 若主机发送的数据CRC校验错误,发送错误好0x02 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;
文档评论(0)