单片机与上位机通信协议的制定
单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。下行协议,即由上位机向单片机发送数据。
而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议!
下行协议由四个字节构成
起始字PRE1byteBBH
命令字ORD
1byteAAHORD_SATA
BBH
DDHORD_PWM
BBH
FFHORD_TEM
值VAL
1byte
01H02H03H04Hvaluevalue
结束字END1byte
EEHEEHEEHEEHEEHEEH
附注
单片机状态转换命令标识模式1:空闲模式2:温度采集模式3:温度采集向上位机传送采集值模式4:PWM测试PWM占空比值修改指令目标温度控制指令
上表是简单的上位机对单片机的控制指令
下述函数是C中封装的串口通信类中的发送函数的封装
publicvoidSerSe
dCommubyteorderDefbytedata参数1为命令字,参数二为要发送的数
调用
据,需要时可直接
fSEND_LENTH
ByteBSe
dTemp
ewByteSEND_LENTHBSe
dTemp0PREBSe
dTemp1orderDefBSe
dTemp2dataBSe
dTemp3ENDthisserialPort1WriteBSe
dTemp0
下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断
ISRUSART_RXC_vect串口接收中断
u
sig
edcharstatusdata
statusUCSRA
首先读取UCSRA的值,再读取UDR值,顺序不
能颠倒,否则读取UDR后的UCSRA的
值即会改变dataUDRifUart_RecvFlag判断缓存中的数据是否读完,读完则接收指令ifstatus1FE1PE1DOR0rx_bufferrx_cou
terdatarx_cou
terswitchrx_cou
tercase1
ifdataUSART_BEGIN_STXrx_cou
ter0break
case4rx_cou
ter0ifdataUSART_END_STXUart_RecvFlag1break
在单片机主循环程序的最前部分进行指令译码
fifUart_RecvFlag接收到命令
switchrx_buffer1
case0xAA单片机状态命令控制;ucWorkStatuerx_buffer2指令数据
breakcase0xDDPWM值修改指令
OCR2rx_buffer2break
case0xFF初始温度设定break
Uart_RecvFlag0
随后进行执行指令
switchucWorkStatue
case1空闲模式break
case2测量模式,但不输出break
case3测量模式,由串口输出break
case4PWM输出测试break
defaultbreak
这样就可以利用串口对单片机进行在线命令控制了;
上行协议的制定!
和下行协议基本一致!
在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度
串口发送缓冲区变量声明volatileu
sig
edchartx_bufferTX_BUFFER_SIZE定义串口发送缓冲区
fvolatileu
sig
edchartx_wr_i
dex0tx_rd_i
dex0tx_cou
ter0rx_wr_i
dex写指针rx_rd_i
dex读指针rx_cou
ter缓冲区数据个数
USART发送函r