HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);
以下为函数原型,但建议看看我的介绍
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
我的介绍:
由以上的代码块看到,他有4个参数
第1:选用哪个串口,这里选用的是usart1
第2:这里的box呢,是我上边定义的一个数组,全局变量,用来存放串口将要发送的数据
第3:这个uart_reci_Data是自定义的宏变量,我这里给了它的值为4,用于确认多少个字节1次发出,看看下面的例子
第4:是时间,可以设置数值,使其在一定时间内完成接受,若超出这个时间,就直接跳出这个串口接收函数,一般可以给100,或者0xff之类的,单位这里先不考虑
SO:例子
如果有
#define uart_reci_Data 4
uint8_t box[4] = {0x01,0x02,0x33,0x44};
int main()
{
HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);
while(1)
{
}
}
意思就是,我stm32外部串口1发送数据,要求串口1 在0xff个单位时间里把数组box[4]的数据发送出去,以一个字节(8bit)为最小单位发送,然后4个字节4个字节(即uart_reci_Data的值)为一份,一次就发一份,也就是发box[4]里的4个元素;如果我们在外面接收的话,就会收到串口1发送的0x01,0x02,0x33,0x44
是 HAL_UART_Receive_IT ,它用来开启对应串口中断
HAL_UART_Receive_IT (&huart1 , box , uart_reci_Data);
我的介绍:
第1:选用哪个串口,这里选用的是usart1
第2:接收到的数据存放与哪个数组,这里是box[4],与上面一样的定义
第3:这个uart_reci_Data是自定义的宏变量,我这里给了它的值为4,用于确认1次收多少个字节,等下看看下面的例子,
是 void HAL_UART_RxCpltCallback,它是中断回调函数,用于接受到数据后进入串口中断,可以对数据进行处理,也可以干点别的事情 ,他甚至有个模板
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1) //因此此处需要认一下是哪个串口收到数据
{
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX) //检测UART发送结束,保证已经完全接收数据,不会丢包
HAL_UART_Receive_IT (&huart1 , box , uart_reci_Data); //再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行
}
}
解释:
1. if那里,确定是哪个串口,因为其他串口也会进入这个中断回调函数的
2. while那里是保证数据不丢包
3. 最后一个就是上面的第一家函数,使用它是为了 再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行
SO:例子,注意:(void HAL_UART_RxCpltCallback)和int main在一个文件下
#define uart_reci_Data 4
uint8_t box[4] = {0};
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//Sept 2: 中断回调函数,执行:接受到东西后,就进入该函数
{ //都不用调用,每次串口接受到数据就会自动进入此函数
if(huart == &huart1) //因此此处需要认一下是哪个串口收到数据
{
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX) //检测UART发送结束
HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);
HAL_UART_Receive_IT (&huart1 , box , uart_reci_Data); //再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行
}
}
int main()
{
HAL_UART_Receive_IT (&huart1 , box , uart_reci_Data);//先开启一次中断,因为它是默认不开中断的
while(1)
{
}
}
意思就是,我外部串口1发送给stm32的数据将会被串口1截取,以一个字节(8bit)为最小单位截取,然后4个字节4个字节(即uart_reci_Data的值)为一份,要求串口1 在0xff个单位时间里收取,并存入数组box中,4个为一份,存入一份box[4]中,这里设置刚刚好4个萝卜(串口1收到的数据)4个坑(box[4]的4个元素,一个元素为一个字节,因为上面定义了box是uint8_t的)
然后再次调用HAL_UART_Transmit,再次发送box里的数据,这里用来验证串口1 是都接收到准确数据,Then,再次打开中断,以保证下一次串口1 接收到数据时能够进入串口中断回调函数
你还可以在HAL_UART_RxCpltCallback里做点别的时,比如开关灯之类的,这个由你自己定义,接收到数据的同时做点事情