你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
stm32fo72用IDLE接收不定长数据
[复制链接]
xp3
提问时间:2018-3-8 09:39 /
阅读主题, 点击返回1楼
赞
0
收藏
0
评论
13
分享
发布时间:2018-3-8 09:39
请先
登录
后回复
13个回答
xp3
回答时间:2018-3-8 12:51:49
a1024a.1 32b0c
点评
zero99
楼主乖,不哭
发表于 2018-3-8 18:00
赞
0
评论
回复
支持
反对
dsjsjf
回答时间:2018-3-15 15:56:34
a0a.1 32b0c
给你一个参考,一个空闲中断,一个事件型任务
/* 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[i].Data = Rs422RxData.Sensor.TcTemp[i].Data;
// HeadData.Sensor.TcTemp[i].Value = Rs422RxData.Sensor.TcTemp[i].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 */
}
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
1
2
/ 2 页
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
点评
/* 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[i].Data = Rs422RxData.Sensor.TcTemp[i].Data;
// HeadData.Sensor.TcTemp[i].Value = Rs422RxData.Sensor.TcTemp[i].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 */
}
评分
查看全部评分