硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3345|回复: 10
收起左侧

[有问必答] 串口只能发送第一个分号之前的内容

[复制链接]

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2018-12-10 11:53:52 | 显示全部楼层 |阅读模式
请教各位大神:
我在做单片机控制串口屏的程序。我想用sprintf函数,把要发送的内容放入数组buf[100],然后再用串口把buf[]中的内容发送到串口屏。可是每次都只能发送一个分号之前的内容。请问这是为什么?
程序如下:
void Display(void)
{
        uint8_t TxCount = 0;
        uint8_t buf[100];
        sprintf(buf,"PIC(0,0,1);DS12(100,20,'电压:%.3fV',1);\r\n",1.23);    //只能发送第一个分号之前的内容,这里是“PIC(0,0,1)”,调换了顺序也是一样;1.23在实际应用中会改成一个变量,这里仅做测试用。
        while(TxCount < countof(buf))
        {   
                /* 发送数据 */
                USART_SendData(USART3, buf[TxCount++]);
                /* 等待发送完成寄存器数据空 */
                while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
                {
                }
        }
}
这些用以控制串口屏的语句都是没问题的,问题应该就是单片机的串口发送这边吧。。

回复

使用道具 举报

36

主题

2041

回帖

2149

积分

至尊会员

积分
2149
发表于 2018-12-10 11:56:02 | 显示全部楼层
你的countof应该用strlen(buf)
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-10 12:50:34 | 显示全部楼层
byccc 发表于 2018-12-10 11:56
你的countof应该用strlen(buf)

嗯,成功了!多谢指教!
回复

使用道具 举报

337

主题

2045

回帖

3061

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3061
发表于 2018-12-10 15:14:10 | 显示全部楼层
byccc 发表于 2018-12-10 11:56
你的countof应该用strlen(buf)

请教以下,这个countof(buf)到底是几呢?

感觉应该是4,但是楼主说的现象是发送了10个字符。。。。。
回复

使用道具 举报

36

主题

2041

回帖

2149

积分

至尊会员

积分
2149
发表于 2018-12-10 15:19:22 | 显示全部楼层
caicaptain2 发表于 2018-12-10 15:14
请教以下,这个countof(buf)到底是几呢?

感觉应该是4,但是楼主说的现象是发送了10个字符。。。。。

这个要看他的countof是如何定义。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-10 15:57:35 | 显示全部楼层
本帖最后由 红烧鱼头 于 2018-12-10 15:58 编辑
caicaptain2 发表于 2018-12-10 15:14
请教以下,这个countof(buf)到底是几呢?

感觉应该是4,但是楼主说的现象是发送了10个字符。。。。。

#define countof(a)   (sizeof(a) / sizeof(*(a)))
这个是串口的例程里面的。
不是10,是100,因为前面定义了buf[100]。
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-10 16:01:03 | 显示全部楼层
我现在把串口发送函数改了一下,就不用去理会字符串的长度了。但是关于sizeof和strlen的这一个知识点还是学到了。
回复

使用道具 举报

337

主题

2045

回帖

3061

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3061
发表于 2018-12-11 09:43:20 | 显示全部楼层
红烧鱼头 发表于 2018-12-10 15:57
#define countof(a)   (sizeof(a) / sizeof(*(a)))
这个是串口的例程里面的。
不是10,是100,因为前面 ...

我是想研究一下这个语法问题。
根据你的描述,因为发送了10个字符,所以countof(a)等于10了,而不是100.
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-11 13:21:20 | 显示全部楼层
caicaptain2 发表于 2018-12-11 09:43
我是想研究一下这个语法问题。
根据你的描述,因为发送了10个字符,所以countof(a)等于10了,而不是100 ...

这整个字符串的长度是43,小于100,所以全都能发出去的。但是串口屏实际执行的只有第一个分号之前的语句,这一点我不太明白,问题应该还是出在我使用的串口屏这边,或许是因为在结束标志(\r\n)之后没有立即停止串口通信的缘故吧。
总之你要说语法的话,countof(a)在这里是等于buf[100]的长度,能将此字符串(长度为43)都发送出去。
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-11 13:22:56 | 显示全部楼层
caicaptain2 发表于 2018-12-11 09:43
我是想研究一下这个语法问题。
根据你的描述,因为发送了10个字符,所以countof(a)等于10了,而不是100 ...

给你一个网页看看有没有帮助:
https://www.cnblogs.com/luori719/p/5218163.html
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-12-11 14:03:31 | 显示全部楼层
byccc 发表于 2018-12-10 11:56
你的countof应该用strlen(buf)

高手,再请教你一下:
这个字符串长度是43,循环发送100次的话,后面57次发送的是什么呢?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-8 03:16 , Processed in 0.224833 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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