有好长一段时间没有更新帖子了,近来稍微有点时间,于是赶紧来更新一下这个系列帖子了,前面介绍了串口收发字符和字符串,这一讲笔者主要跟大家讲解一下串口首发十六进制数。有做工项目的小伙伴 们或许会发现,在很多应用场合,实际上都是用十六进制数来进行数据传递,包括MODBUS协议也是一些十六进制的数。所以,笔者觉得有必要跟大家一起分享一下如何使用串口来收发十六进制数。
有了前面的基础,相信大家对串口收发数据并不陌生了,本例笔者以单个字节的十六进制数的收发为例,进行简单介绍。
例如,笔者现在要实现这么一个功能:
上位机发送0x01,IAP15W413AS控制板Y00输出ON,并返回接收到的数据;
上位机发送0x02,IAP15W413AS控制板Y01输出ON,并返回接收到的数据;
上位机发送0x03,IAP15W413AS控制板Y02输出ON,并返回接收到的数据;
上位机发送0x04,IAP15W413AS控制板Y03输出ON,并返回接收到的数据;
上位机发送0x05,IAP15W413AS控制板Y04输出ON,并返回接收到的数据;
上位机发送0x06,IAP15W413AS控制板Y05输出ON,并返回接收到的数据;
上位机发送0xFF,IAP15W413AS控制板关闭所有输出,并返回接收到的数据;
看上去似乎很简单,可是,对于新手来说也未必做得写的出来。那么笔者就简单介绍一下,想要实现上述功能,该怎么实现吧。
首先,当然是串口配置了,还是用库函数进行配置,定义波特率为115200:
/**************** 串口配置函 ******************/
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式,UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer2; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2,USART3,USART4
}
接下来就是串口首发函数了,其实这里也很简单,学过单片机的小伙伴应该都知道,串口接收数据有两种方式,即:中断方式和查询方式,笔者这里用的是中断的方法,在串口中断函数中接收到数据后,根据接收到的数据,让不同IO口执行相关动作,执行完动作后,将接收到的数据发送出去。
/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
u8 UART1_DataTemp;
//命令格式:帧头+长度+命令字+地址+指令
//5A A5 03 06 00 01--Y00-ON 5A A5 03 06 00 00--Y00-OFF
if(RI)
{
RI = 0;
UART1_DataTemp = SBUF;
if(UART1_DataTemp==0x01)//Y0
{
OUT00 = 1;
}
if(UART1_DataTemp==0x02)//Y1
{
OUT01 = 1;
}
if(UART1_DataTemp==0x03)//Y2
{
OUT02 = 1;
}
if(UART1_DataTemp==0x04)//Y3
{
OUT03 = 1;
}
if(UART1_DataTemp==0x05)//Y4
{
OUT04 = 1;
}
if(UART1_DataTemp==0x06)//Y5
{
OUT05 = 1;
}
if(UART1_DataTemp==0xFF)//Y0-Y5 OFF
{
OUT00 = 0;
OUT01 = 0;
OUT02 = 0;
OUT03 = 0;
OUT04 = 0;
OUT05 = 0;
}
SBUF = UART1_DataTemp;
}
if(TI)
{
TI = 0;
COM1.TX_Busy = 0;
}
}
程序部分比较简单,相信应该不用笔者再做过多解释了。下面我们将程序下载到板子中进行验证一下:
分别发送十六进制数:01、02、03、04、05、06,可以看到控制板上的Y0-Y5对于的LED依次被点亮,最后发送FF的时候,Y0-Y5对于的LED全部熄灭。我们可以来看一下效果图:
http://v.youku.com/v_show/id_XMzExOTY2OTE0NA==.html?spm=a2h3j.8428770.3416059.1
http://v.youku.com/v_show/id_XMzExOTY2OTE0NA==.html?spm=a2h3j.8428770.3416059.1
最后附上源代码: