新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > AVR单片机与上位机通信协议的制定

AVR单片机与上位机通信协议的制定

作者:时间:2013-12-07来源:网络收藏

单片机和的串口分为上行协议和下行协议,要分别制定!

上行协议,即由单片机向发送数据。

下行协议,即由向单片机发送数据。

又要分固定长度和不定长度两种

本文所介绍的协议属于简单的固定字长的

下行协议由四个字节构成

起始字PRE 命令字ORD 值VAL 结束字END 附注
1byte 1byte 1byte 1byte  
BBH AAH(ORD_SATA)     单片机状态转换命令标识
01H EEH 模式1:空闲
02H EEH 模式2:温度采集
03H EEH 模式3:温度采集向上位机传送采集值
04H EEH 模式4:PWM测试
BBH DDH(ORD_PWM) value EEH PWM占空比值修改指令
BBH FFH(ORD_TEM) value EEH 目标温度控制指令

上表是简单的上位机对单片机的控制指令

下述函数是C#中封装的串口通信类中的发送函数的封装

public void SerSendCommu(byte orderDef, byte data)//参数1为命令字,参数二为要发送的数

//据,需要时可直接调用
{
Byte[] BSendTemp = new Byte[SEND_LENTH];
BSendTemp[0] = PRE;
BSendTemp[1] = orderDef;
BSendTemp[2] = data;
BSendTemp[3] = END;
this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);
}

下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断

ISR(USART_RXC_vect)//串口接收中断
{
unsigned char status,data;
status = UCSRA; //**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的

//值即会改变**
data = UDR;
if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接收指令
{
if((status((1FE)|(1PE)|(1DOR)))==0)
{
rx_buffer[rx_counter]=data;
rx_counter++;
switch(rx_counter)
{
case 1:
if(data!=USART_BEGIN_STX)
rx_counter=0;
break;
case 4:
rx_counter=0;
if(data==USART_END_STX)
Uart_RecvFlag=1;
break;
}
}
}

}


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭