MSP432单片机通过串口通信与正点原子图传模块通信
- 首先要了解通信协议,这里官方所给的资料中已经提到。
在使用任何模块之前应该了解模块与单片机之间的通信协议。最常见的比如波特率,奇偶校验等等。但是只满足这些是不够的,有的模块通信过程中往往会有帧头帧尾的情况,这种情况下,我们就需要根据官方给的资料自己来写。话不多说,直接上代码:
static void Data_Prepare(uint8_t data)
{
static int dataIndex=0;
static int A=waitForStart;
switch(A)
{
case waitForStart:
if(data==0x66)
{
dataIndex=1;
Receive_Data_Array[0]=data;
A=waitForData;
}
else
{
A=waitForStart;
}
break;
case waitForData:
Receive_Data_Array[dataIndex]=data;
dataIndex++;
if(dataIndex==6)
{
A=waitForChksum;
}
break;
case waitForChksum:
Receive_Data_Array[6]=data;
if(wifiDataCrc(Receive_Data_Array))
{
A=waitForEnd;
}
else
{
A=waitForStart;
}
break;
case waitForEnd:
if(data==0x99)
{
Receive_Data_Array[7]=data;
USART2_Send(Receive_Data_Array,8);
flag=0;
}
else
{
A=waitForStart;
}
A=waitForStart;
break;
default: break;
}
}
其中在数据协议中,还要满足第六位与前五位满足与或关系。代码如下
static bool wifiDataCrc(uint8_t *data)
{
int temp=(data[1]^data[2]^data[3]^data[4]^data[5])&0xff;
if(temp==data[6])
return true;
return false;
}
这里直接利用官方给的历程就好。
- 第二步配置432单片机串口
const eUSCI_UART_ConfigV1 uartConfig =
{
EUSCI_A_UART_CLOCKSOURCE_SMCLK,
39,
1,
0,
EUSCI_A_UART_NO_PARITY,
EUSCI_A_UART_MSB_FIRST,
EUSCI_A_UART_ONE_STOP_BIT,
EUSCI_A_UART_MODE,
EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,
EUSCI_A_UART_8_BIT_LEN
};
void USART2_Init()
{
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,
GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);
MAP_UART_initModule(EUSCI_A2_BASE, &uartConfig);
MAP_UART_enableModule(EUSCI_A2_BASE);
MAP_UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
MAP_Interrupt_enableInterrupt(INT_EUSCIA2);
}
- 最后通过一个全局数组在mai函数中,比较数组的每一位数据是否是你想要的数据即可。
if(Receive_Data_Array[1]==0x01&&Receive_Data_Array[2]==0x01
&&Receive_Data_Array[3]==0x01&&Receive_Data_Array[4]==0x01
&&Receive_Data_Array[5]==0X22&&Receive_Data_Array[6]==0x22)
{
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
}
else if(Receive_Data_Array[1]==0x01&&Receive_Data_Array[2]==0x01
&&Receive_Data_Array[3]==0x01&&Receive_Data_Array[4]==0x01
&&Receive_Data_Array[5]==0X82&&Receive_Data_Array[6]==0x82)
{
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0);
}
通过上述几步,就可以完成简单的串口通信。还可以举一反三,在帧头帧尾不是一个字节的情况下,应该怎么写自己的通信协议呢?在这理为大家卖个关子,以后遇到多字节帧头帧尾时串口通信时,在为大家讲解。
|