单片机与上位机通信协议的制定 单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定! 上行协议,即由单片机向上位机发送数据。 下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度两种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成 起始字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&((1<