OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4235|回复: 2

请教下 关于stm32f407的串口发送问题

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
发表于 2017-6-26 16:46:50 | 显示全部楼层 |阅读模式
1金钱
程序是这样的

unsigned char ChrToHex(unsigned char uc_val) //字符转字节
{
    if ((uc_val >= 0x30) && (uc_val <= 0x39))
    {
        return (uc_val - 0x30);
    }
    if ((uc_val == 'A') || (uc_val == 'a'))
    {
        return 10;
    }
    if ((uc_val == 'B') || (uc_val == 'b'))
    {
        return 11;
    }
    if ((uc_val == 'C') || (uc_val == 'c'))
    {
        return 12;
    }
    if ((uc_val == 'D') || (uc_val == 'd'))
    {
        return 13;
    }
    if ((uc_val == 'E') || (uc_val == 'e'))
    {
        return 14;
    }
    if ((uc_val == 'F') || (uc_val == 'f'))
    {
        return 15;
    }
    return 0;
}

void StrToHex(unsigned char *p_dest, unsigned char *p_src, unsigned char uc_base, unsigned char uc_size)//字符串数组转换字节数组
{
    unsigned char tmp[2];
    unsigned char i;
    for (i = 0; i < uc_size; i++)
    {
        tmp[0] = p_src[uc_base + i * 2];
        tmp[1] = p_src[uc_base + i * 2 + 1];
        p_dest[i] = ChrToHex(tmp[0]) * 0x10 + ChrToHex(tmp[1]);
    }
}

void USART1_SCAN()
{
    u16  len;
    u16 i;
    if(USART_RX_STA&0x8000)
    {
        len=USART_RX_STA&0x3fff;

        StrToHex(str,USART_RX_BUF,0,20);

        ctrl=str[0];
        func=str[1];
        arg1=str[2];
        arg2=str[3];
        arg3=str[4];
        arg4=str[5];

        USART_SendData(USART1,ctrl);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        USART_SendData(USART1,func);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        USART_SendData(USART1,arg1);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        USART_SendData(USART1,arg2);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        USART_SendData(USART1,arg3);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        USART_SendData(USART1,arg4);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

        printf("\r\n");

        for(i=0; i<len; i++)
        {
            USART_RX_BUF[i]=0;
        }
        len=0;
        USART_RX_STA=0;
    }
}


那么USART_SendData(USART1,arg4);是库函数 发送单字节
但是如果不加上后面的判断发送完成的一句
为什么只能发送最后一个数据
看了他原函数 也是只有一句将数据写入数据寄存器的
还是说要像51的一样再写一个发送函数 在这段程序中 如果我用循环发送的话是没有问题的



最佳答案

查看完整内容[请看2#楼]

你是想直接发送一个字符串嘛,没有必要那么麻烦的,直接用printf(),因为原子哥已经把串口1与printf()给绑定了,想发送一个字符串就直接printf("%s\r\n",str);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-6-26 16:46:51 | 显示全部楼层
你是想直接发送一个字符串嘛,没有必要那么麻烦的,直接用printf(),因为原子哥已经把串口1与printf()给绑定了,想发送一个字符串就直接printf("%s\r\n",str);
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 17:03:03 | 显示全部楼层
lzq12 发表于 2017-6-26 16:58
你是想直接发送一个字符串嘛,没有必要那么麻烦的,直接用printf(),因为原子哥已经把串口1与printf()给绑 ...

这个我知道 printf和for循环发送都是没问题的 但是发送单字节的时候是不行 因为我习惯了串口返回数据来调试,所以单字节的情况还是比较多的 而且只看几个关键变量的话 发送单字节数据都可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 10:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表