研钵厂家
免费服务热线

Free service

hotline

010-00000000
研钵厂家
热门搜索:
行业资讯
当前位置:首页 > 行业资讯

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

发布时间:2020-07-21 18:00:44 阅读: 来源:研钵厂家

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

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

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

而通信协议又要分固定长度和不定长度两种

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

下行协议由四个字节构成

起始字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;ite(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;}}}}

广州吸脂医院

深圳植发价格

南京吸脂

长春磨骨医院