专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
stm32fo72用IDLE接收不定长数据
2019-07-14 18:29
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
5155
10
1766
求助
STM32
fo72用IDLE接收不定长数据,
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
tianyou15
2019-07-16 09:02
给你一个参考,一个空闲中断,一个事件型任务
/* USART6 串口空闲中断函数 */
void HeaterComm_Callback(void)
{
uint32_t TmpFlag = 0;
uint32_t TmpLength;
TmpFlag = __HAL_UART_GET_FLAG(&huart6, UART_FLAG_IDLE);
if((TmpFlag != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart6);
//HAL_UART_AbortReceive_IT(&huart6);
HAL_UART_DMAStop(&huart6);
TmpLength = __HAL_DMA_GET_COUNTER((DMA_HandleTypeDef *)&hdma_usart6_rx);
//TmpLength = hdma_usart6_rx.Instance->NDTR;
HeaterComm.DataLength = 32 - TmpLength;
osSignalSet (HeaterComm_TaskHandle, 1); //HeaterComm.ReceiveFlag = 1;
}
}
/* HeaterCommTask function */
void HeaterCommTask(void const * argument)
{
/* USER CODE BEGIN HeaterCommTask */
osEvent Event;
HeaterComm.CommStatus = 1;
HeadData.Sensor.TcTemp[0].Status = Normal;
HeadData.Sensor.TcTemp[1].Status = Normal;
HeadData.Sensor.TcTemp[2].Status = Normal;
HeadData.Sensor.TcTemp[0].Value = 25;
HeadData.Sensor.TcTemp[1].Value = 25;
HeadData.Sensor.TcTemp[2].Value = 25;
__HAL_UART_ENABLE_IT(&huart6, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
/* Infinite loop */
for(;;)
{
Event = osSignalWait(1, 2000);
if(Event.status == osEventSignal)
{//接收到一帧数据
osMutexWait (MutexGetTempHandle, 3);
if((Rs422RxData.Sensor.Head == 0x4c)
&& (crc16(Rs422RxData.Char, HeaterComm.DataLength - 2) == Rs422RxData.Sensor.Crc))
{
HeadData.Sensor.NtcTemp = Rs422RxData.Sensor.NtcTemp;
for(uint8_t i=0; i<3; i++)
{
HeadData.Sensor.TcTemp
.Data = Rs422RxData.Sensor.TcTemp
.Data;
// HeadData.Sensor.TcTemp
.Value = Rs422RxData.Sensor.TcTemp
.Value;
}
HeaterComm.CommStatus = 1;
}
else
{
TestData++;
// HeaterComm.DataLength = 0;
}
HeaterComm.DataLength = 0;
osMutexRelease (MutexGetTempHandle);
HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
}
else
{//接收超时
HeaterComm.CommStatus = 0;
}
xEventGroupSetBits(xCreatedEventGroup, EVENT_BIT_HEATER_COMM_TASK);
osThreadYield();
}
/* USER CODE END HeaterCommTask */
}
加载中...
查看其它10个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/* USART6 串口空闲中断函数 */
void HeaterComm_Callback(void)
{
uint32_t TmpFlag = 0;
uint32_t TmpLength;
TmpFlag = __HAL_UART_GET_FLAG(&huart6, UART_FLAG_IDLE);
if((TmpFlag != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart6);
//HAL_UART_AbortReceive_IT(&huart6);
HAL_UART_DMAStop(&huart6);
TmpLength = __HAL_DMA_GET_COUNTER((DMA_HandleTypeDef *)&hdma_usart6_rx);
//TmpLength = hdma_usart6_rx.Instance->NDTR;
HeaterComm.DataLength = 32 - TmpLength;
osSignalSet (HeaterComm_TaskHandle, 1); //HeaterComm.ReceiveFlag = 1;
}
}
/* HeaterCommTask function */
void HeaterCommTask(void const * argument)
{
/* USER CODE BEGIN HeaterCommTask */
osEvent Event;
HeaterComm.CommStatus = 1;
HeadData.Sensor.TcTemp[0].Status = Normal;
HeadData.Sensor.TcTemp[1].Status = Normal;
HeadData.Sensor.TcTemp[2].Status = Normal;
HeadData.Sensor.TcTemp[0].Value = 25;
HeadData.Sensor.TcTemp[1].Value = 25;
HeadData.Sensor.TcTemp[2].Value = 25;
__HAL_UART_ENABLE_IT(&huart6, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
/* Infinite loop */
for(;;)
{
Event = osSignalWait(1, 2000);
if(Event.status == osEventSignal)
{//接收到一帧数据
osMutexWait (MutexGetTempHandle, 3);
if((Rs422RxData.Sensor.Head == 0x4c)
&& (crc16(Rs422RxData.Char, HeaterComm.DataLength - 2) == Rs422RxData.Sensor.Crc))
{
HeadData.Sensor.NtcTemp = Rs422RxData.Sensor.NtcTemp;
for(uint8_t i=0; i<3; i++)
{
HeadData.Sensor.TcTemp.Data = Rs422RxData.Sensor.TcTemp.Data;
// HeadData.Sensor.TcTemp.Value = Rs422RxData.Sensor.TcTemp.Value;
}
HeaterComm.CommStatus = 1;
}
else
{
TestData++;
// HeaterComm.DataLength = 0;
}
HeaterComm.DataLength = 0;
osMutexRelease (MutexGetTempHandle);
HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
}
else
{//接收超时
HeaterComm.CommStatus = 0;
}
xEventGroupSetBits(xCreatedEventGroup, EVENT_BIT_HEATER_COMM_TASK);
osThreadYield();
}
/* USER CODE END HeaterCommTask */
}
一周热门 更多>