- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)