打印
[技术问答]

gcc编译新唐单片机NUC123,串口打印查询方式有问题

[复制链接]
2957|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qtdyn|  楼主 | 2015-9-9 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新唐单片机NUC123,gcc编译,这样发送竟然有问题
uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
    uint32_t  u32Count;

    for(u32Count = 0; u32Count != u32WriteBytes; u32Count++)
    {

            while((uart->FSR) & UART_FSR_TX_FULL_Msk);
                uart->DATA = pu8TxBuf[u32Count];
    }
    return u32Count;
}

调用
UART_Write(UART0,"aaa",3);
UART_Write(UART0,"bbb",3);
打印结果为 aaa
调用
UART_Write(UART0,"aaa",3);
delay_ms(10);
UART_Write(UART0,"bbb",3);
打印结果为aaabbb
PS:中断,串口接收都调试通过了,就串口发送有这个问题,希望高手给予解答。-O0方式编译,没有进行优化
沙发
稳稳の幸福| | 2015-9-9 17:57 | 只看该作者
打印完成后再执行第二条,有什么标志寄存器的。

使用特权

评论回复
板凳
qtdyn|  楼主 | 2015-9-9 18:04 | 只看该作者
稳稳の幸福 发表于 2015-9-9 17:57
打印完成后再执行第二条,有什么标志寄存器的。

while((uart->FSR) & UART_FSR_TX_FULL_Msk);  //等待fifo 非空

使用特权

评论回复
地板
玛尼玛尼哄| | 2015-9-9 18:17 | 只看该作者
楼主执行那个检测了没,应该就是发送完后,还没有完成,就开始第二条了。

使用特权

评论回复
5
捉虫天师| | 2015-9-9 19:43 | 只看该作者
延时不到位?这个还是发送完,要等一下,等发彻底了。

使用特权

评论回复
6
天灵灵地灵灵| | 2015-9-9 19:46 | 只看该作者
一般发送这个指令里面就弄个延时放进去,肯定不会出问题了。

使用特权

评论回复
7
643757107| | 2015-9-9 20:23 | 只看该作者
在发送函数里就应该有个判断语句,或延时几个周期数。

使用特权

评论回复
8
wahahaheihei| | 2015-9-9 20:30 | 只看该作者
  while((uart->FSR) & UART_FSR_TX_FULL_Msk);
这个东西判断后,发送,然后最后一次发送后,没有再判断就退出来了,在退出前再判断一次就行了 。

使用特权

评论回复
9
gejigeji521| | 2015-9-9 22:14 | 只看该作者
uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
    uint32_t  u32Count;

    for(u32Count = 0; u32Count != u32WriteBytes; u32Count++)
    {

            while((uart->FSR) & UART_FSR_TX_FULL_Msk);
                uart->DATA = pu8TxBuf[u32Count];
    }            while((uart->FSR) & UART_FSR_TX_FULL_Msk);
    return u32Count;
}

使用特权

评论回复
10
qtdyn|  楼主 | 2015-9-10 10:53 | 只看该作者
gejigeji521 发表于 2015-9-9 22:14
uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{[/backcolo ...

多谢你的回复,这样做还是不行,我已经试过很多方法了,不知道是什么原因。并且keil里边的代码和我的代码是一样的。
即时后面你加的那个while等待不加入,第二次进入这个函数,也要先执行一次while等待,所以肯定没有影响

使用特权

评论回复
11
cspoly| | 2015-9-10 17:54 | 只看该作者
在keil下執行都正常,
樓主的gcc是用哪個的?

使用特权

评论回复
12
gejigeji521| | 2015-9-10 20:57 | 只看该作者
Keil好好的,就是GCC不好,看来是GCC的问题了,升级到最新试试。

使用特权

评论回复
13
huangcunxiake| | 2015-9-11 10:31 | 只看该作者
一般用GCC都是在Linux下开发才用。

使用特权

评论回复
14
李香兰| | 2015-9-11 10:47 | 只看该作者
GCC编译报出的错误好难解决啊

使用特权

评论回复
15
mwang| | 2015-9-11 16:18 | 只看该作者
用GNU Tools ARM Embedded 4.9 2015q1,NUC123 BSP  v3.00.001

..\Library\StdDriver\src\uart.c里:
uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
    uint32_t  u32Count, u32delayno;

    for(u32Count = 0; u32Count != u32WriteBytes; u32Count++)
    {
        u32delayno = 0;
        while((uart->FSR & UART_FSR_TE_FLAG_Msk) == 0)   /* Wait Tx empty and Time-out manner */
        {
            u32delayno++;
            if(u32delayno >= 0x40000000)
                return FALSE;
        }
        uart->THR = pu8TxBuf[u32Count];    /* Send UART Data from buffer */
    }

    return u32Count;

}

测试正常。

使用特权

评论回复
16
DreamofOven| | 2015-9-11 21:05 | 只看该作者
发送完要有足够的延时

使用特权

评论回复
17
huangcunxiake| | 2015-9-11 21:23 | 只看该作者
我都是在Keil下搞,可以**到2020。

使用特权

评论回复
18
mintspring| | 2015-9-11 21:35 | 只看该作者
没用过GCC,不知道原型设计上,跟其他的有何不同

使用特权

评论回复
19
qtdyn|  楼主 | 2015-9-14 14:51 | 只看该作者
huangcunxiake 发表于 2015-9-11 21:23
我都是在Keil下搞,可以**到2020。

使用gcc是为了搭建开源平台。开发普通产品肯定也是用keil的。

使用特权

评论回复
20
qtdyn|  楼主 | 2015-9-14 14:52 | 只看该作者
mwang 发表于 2015-9-11 16:18
用GNU Tools ARM Embedded 4.9 2015q1,NUC123 BSP  v3.00.001

..\Library\StdDriver\src\uart.c里:

我的是gcc4.8,我们的代码没什么差别啊,难道是gcc版本问题?等我测试一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝