在线时间16 小时
UID3298280
ST金币70
蝴蝶豆0
注册时间2016-8-4
该用户从未签到
中级会员
- 最后登录
- 2020-5-8
|
1ST金币
尝试使用HAL_UART_Transmit_DMA进行发送数据到串口上位机。main()函数的代码主要为如下三段:
1. 用printf打印一些字符串到PC-----------运行正常
2. 用HAL_UART_Transmit_DMA打印一段字符串到PC---故意打印两遍均正常
3. 将HAL_UART_Transmit_DMA放在while(1)循环中每隔2s打印------不正常,PC端未见输出
不清楚什么影响了HAL_UART_Transmit_DMA在while(1)的正常运行? 在做debug时将断点设置到while(1)中的HAL_UART_Transmit_DMA行,再单步运行又可以打印出来字符串,不知道如何分析,求指点。
- int main(void)
- {
- ***
- uint8_t aTxMessage[] = "\r\n**** UART-Hyperterminal communication based on DMA ***\r\n The 2nd line with DMA \r\n";
- /* RS485发送前才使能发送模式,发送完毕马上转为接收模式 */
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_SET); //RS485输出使能
- printf("***************************************************\r\n\r\n");
- printf("* *\r\n");
- printf("************* 测试一下中文字符 ********************\r\n");
- printf("* *\r\n");
- printf("***************************************************\r\n\r\n");
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_RESET); //RS485输入使能
- HAL_Delay(1000);
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_SET); //RS485输出使能
- HAL_Delay(1000);
- HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage)-1);
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_RESET); //RS485输入使能
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_SET); //RS485输出使能
- HAL_Delay(1000);
- HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage)-1);
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_RESET); //RS485输入使能
- HAL_Delay(1000);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_SET); //RS485输出使能
- HAL_Delay(1000);
- HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage)-1);
- HAL_GPIO_WritePin(DMX_DIR_GPIO_Port, DMX_DIR_Pin, GPIO_PIN_RESET); //RS485输入使能
- HAL_Delay(1000);
- }
- /* USER CODE END 3 */
- }
复制代码
|
最佳答案
查看完整内容
把上述代码改为:
应该就可以了。
原因是串口数据未发送完成,就将RS485输出使能关闭了。采用延时后关闭,或者发送完成回调中开启RS485输入使能开启。
|