STM32/STM8技术william hill官网
直播中

李皓圳

7年用户 1056经验值
私信 关注
[问答]

cubemx配置的串口中断发送HAL_UART_Transmit_IT不行



为何HAL_UART_Transmit可发送,改成HAL_UART_Transmit_IT就不行了
cube配置的STM32f407系统
其他代码均一样

        while(HAL_OK != HAL_UART_Transmit_IT(DEFAULT_UART, (uint8_t*)UartTxBuffer, index));    //不行
        while(HAL_OK != HAL_UART_Transmit(DEFAULT_UART, (uint8_t*)UartTxBuffer, index, 0xFFFF));  //可以




----
搞定,见21楼

回帖(24)

华农武

2018-12-10 08:48:39
改为中断发送,首先你开启串口的中断没有?
举报

李皓圳

2018-12-10 08:57:12
引用: 骑猪去天山 发表于 2018-12-10 19:49
改为中断发送,首先你开启串口的中断没有?

开启了的,USART1 global interrupt有勾选(Cube里面只有这一个)
同时RX用中断方式接受无问题。
举报

李进锋

2018-12-10 09:03:47
可以把代码传上来或者截图大家好看下,另外你板子用的是哪个?
举报

李开心

2018-12-10 09:10:09
当然不行,应该在IT里面写中断处理程序
举报

李皓圳

2018-12-10 09:23:51
引用: deco_89 发表于 2018-12-10 20:04
可以把代码传上来或者截图大家好看下,另外你板子用的是哪个?

板子是某stm32的开发板,因为是别人给我的,恕我直言,真不知道是什么型号,只知道是F407

代码如下,自写xprintf:


int xprintf(const char *format, ...)
{
        unsigned int index = 0;
        int k;
        va_list marker;

        /* the first parameter location is after passing format
         */
        va_start(marker, format);

        /* wait until Tx Available
        translate into string - vxprintf
         */
        UartCheckTxAvailable();

        k = vxprintf(UartTxBuffer, &index, format, marker);
        va_end(marker);

        /* put out to uart
        */
//        while(HAL_OK != HAL_UART_Transmit_IT(DEFAULT_UART, (uint8_t*)UartTxBuffer, index));
        while(HAL_OK != HAL_UART_Transmit(DEFAULT_UART, (uint8_t*)UartTxBuffer, index, 0xFFFF));
        UartSetTxAvailable();

        return k;
}
举报

李进锋

2018-12-10 09:33:30
引用: 深海零下一度1 发表于 2018-12-10 20:24
板子是某stm32的开发板,因为是别人给我的,恕我直言,真不知道是什么型号,只知道是F407

代码如下,自写xprintf:

你只有这段代码没用啊,UartSetTxAvailable(); 是要干嘛?初始化怎么处理的?配置怎么处理的,建议还是从基础多练习几个例程吧,使用HAL库的话不管你用什么板子只要配置好了,应该都没问题的
举报

李皓圳

2018-12-10 09:46:36
引用: naiztycheng 发表于 2018-12-10 20:10
当然不行,应该在IT里面写中断处理程序

中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里面处理后续,第一次也肯定应该发送得出去才对。。
但是第一次也必然发不出

同时rx一切正常,中断里面一次抓一个,enqueue
举报

陈炜

2018-12-10 09:54:15
楼主 其实那两个函数并不一样。

上面各位的建议都非常 好,看看注释,借助例程自己捣鼓几下就知道差别了。
1 举报

孙婷婷

2018-12-10 10:11:19
仿真一下,进入串口发送以后,周到哪一步出的错。
举报

李开心

2018-12-10 10:29:05
引用: 深海零下一度1 发表于 2018-12-10 20:47
中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里面处理后续,第一次也肯定应该发送得出去才对。。
但是第一次也必然发不出

我看错了,你说的对。你确定中断设置的对吗?
举报

李开心

2018-12-10 10:39:26
引用: 深海零下一度1 发表于 2018-12-10 20:47
中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里面处理后续,第一次也肯定应该发送得出去才对。。
但是第一次也必然发不出

我之前做过一个虚拟串口的,觉得程序写得也对,就是调不通,每次接受到的数也都正常但是发送出去被电脑串口终端接收就不成。后来发觉是串口终端的问题。但是推测你这个不是这个原因。你在调试的时候时钟卡在while那个地方吗?还是while那个地方已经过去了,但是收不到数据?
举报

李皓圳

2018-12-10 10:57:01
引用: deco_89 发表于 2018-12-10 20:34
你只有这段代码没用啊,UartSetTxAvailable(); 是要干嘛?初始化怎么处理的?配置怎么处理的,建议还是从基础多练习几个例程吧,使用HAL库的话不管你用什么板子只要配置好了,应该都没问题的

UartSetTxAvailable 取mutex而已,后面是give mutex
初始化都是用的cubemx生成的,配置你要说有问题吧,直接block的函数发送又是正常的
说中断配置有问题吧,rx中断又是正常的,rx也是用中断收的。
举报

李皓圳

2018-12-10 11:05:44
引用: huazhe 发表于 2018-12-10 20:54
楼主 其实那两个函数并不一样。

上面各位的建议都非常 好,看看注释,借助例程自己捣鼓几下就知道差别了。

我已经读过函数的说明了,例程没有找到完全可用的,都只是代码片段
而且似乎都是直接用_IT函数发送就成功了,没人提到不行

再次强调,我rx中断方式ok,tx 非中断也ok!
举报

李皓圳

2018-12-10 11:12:37
引用: TOPCB 发表于 2018-12-10 21:11
仿真一下,进入串口发送以后,周到哪一步出的错。

手里只有stlink可以仿真吗?

顺便请教这个函数是否是 先填好内容,最后到
    /* Enable the UART Transmit data register empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);

这里启动发送过程?
举报

李皓圳

2018-12-10 11:26:12
引用: naiztycheng 发表于 2018-12-10 21:40
我之前做过一个虚拟串口的,觉得程序写得也对,就是调不通,每次接受到的数也都正常但是发送出去被电脑串口终端接收就不成。后来发觉是串口终端的问题。但是推测你这个不是这个原因。你在调试的时候时钟卡在while那个地方吗?还是while那个地方已经过去了,但是收不到数据? ...

中断就是CubeMX直接配置的。。都是默认设定,你要说配错了吧。。RX又是中断方式正常使用。
调试没发现卡在什么地方。。

不过CubeMX 最新版问题是不少,4.12发现eth部分PHY_MICR_INT_OE这个值会生成错误,本来是1写成了2
举报

孙婷婷

2018-12-10 11:42:49
直接调用HAL_UART_Transmit_IT进入发送中断
举报

李开心

2018-12-10 11:49:43
引用: 深海零下一度1 发表于 2018-12-10 22:26
中断就是CubeMX直接配置的。。都是默认设定,你要说配错了吧。。RX又是中断方式正常使用。
调试没发现卡在什么地方。。

我用401做一个实验一下
举报

李波

2018-12-10 11:58:46
hal把一切都写好了
在cube里配置好usart 和usart中断
然后调用hal_usart_transmit_it
ok

中断中已经有了处理   不用你加
举报

李波

2018-12-10 12:05:55
还有其实重定向比这个好用
举报

更多回帖

发帖
×
20
完善资料,
赚取积分