打印

串口接收字符串函数的问题

[复制链接]
5876|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
poplaji|  楼主 | 2013-4-30 00:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 poplaji 于 2013-4-30 00:53 编辑
void Uart_GetString(char *string)    //该函数具有回送功能~
{
    char *string2 = string;
    char c;
    while((c = Uart_Getch())!=''''\r'''') //判断是否是回车符
    {
        if(c==''''\b'''') //如果是退格键
        {
            if( (int)string2 < (int)string )
            {
                Uart_Printf("\b \b");
                string--;
            }
        }
        else
        {
            *string++ = c;
            Uart_SendByte(c);
        }
    }
    *string=''''\0''
    Uart_SendByte(''''\n''''); //回车换行
}
这是一个串口接收字符串的函数,函数里面的string2有什么用么?
有谁能帮我分析一下这个string2的作用么,有点不太懂。

PS:额外加两个问题:
1.那个Uart_Printf("\b \b");为什么是两个\b,我试了一个\b是没法删除字符的。
2.我记得学习C++的时候我做过一些简单的例子,char* c,这个c其实就是字符串的地址,例如char* c=“abcd”
如果你cout<<c的话,会输出abcd,如果cout<<(c+1)会输出bcd,也就是说c是“abcd”的首地址,那么这个函数里面的参数string,在函数里面若干++操作之后,不再是得到字符串的首地址了?而应该是最后的地址?

相关帖子

沙发
huttu| | 2013-4-30 00:21 | 只看该作者
简单分析一下,string2初始化string值,而string是输入缓冲指针,每输入一个值即指针加一。
功能是如果碰到退格键,且不是第一个字符,将数据缓冲回退一个字符。

使用特权

评论回复
板凳
poplaji|  楼主 | 2013-4-30 00:52 | 只看该作者
huttu 发表于 2013-4-30 00:21
简单分析一下,string2初始化string值,而string是输入缓冲指针,每输入一个值即指针加一。
功能是如果碰到 ...

嗯,刚才去查了一下,应该是判断第一个字符是不是退格符的比对标准。
大侠,还有两个疑问,
1.那个Uart_Printf("\b \b");为什么是两个\b,我试了一个\b是没法删除字符的。
2.我记得学习C++的时候我做过一些简单的例子,char* c,这个c其实就是字符串的地址,例如char* c=“abcd”
如果你cout<<c的话,会输出abcd,如果cout<<(c+1)会输出bcd,也就是说c是“abcd”的首地址,那么这个函数里面的参数string,在函数里面若干++操作之后,不再是得到字符串的首地址了?而应该是最后的地址?

使用特权

评论回复
地板
john_lee| | 2013-4-30 09:39 | 只看该作者
为什么是 "\b \b",那纯粹是显示的需要,因为在 terminal 上,接收到一个 '\b',光标只会向左移动一格,而并不会把光标处的字符擦掉,为了擦掉光标处显示的字符,需要再输出一个 '空格',然后字符被擦掉了,但光标也同时向右移动了,到这一步,光标相对于以前的位置,那就是没有动,那么就需要再次输出一个 '\b' 把光标左移。

string在函数中会改变值,而操作逻辑本身需要string的原始值来做比较,所以就在函数开始处备份了string的原始值到string2。
在函数中如果判断是退格键,那么需要比较退格是否已经退到了缓冲的初始点,这个就是用那个 string 和 string2 比较的语句实现的(那两个(int)的强制转换,纯粹是画蛇添足)。

使用特权

评论回复
5
poplaji|  楼主 | 2013-4-30 13:41 | 只看该作者
john_lee 发表于 2013-4-30 09:39
为什么是 "\b \b",那纯粹是显示的需要,因为在 terminal 上,接收到一个 '\b',光标只会向左移动一格,而 ...

两个退格符,第一个左移一个格,但是不删除字符,第二个删除字符但是不左移,是这样么。你前面回答的左移和右移我有点没弄懂。

使用特权

评论回复
6
john_lee| | 2013-4-30 14:53 | 只看该作者
本帖最后由 john_lee 于 2013-4-30 15:02 编辑

看来光说不行了,非要举例才明白:
假设当前在终端上,从第1列开始有一串字符:hello,光标位于第 6 列,就是字母 'o' 的右边。我以下划线表示光标:
hello_
现在我们输出 3 个字符到终端:"\b \b",第 1 个字符是 '\b'(退格,0x8),第 2 个字符是 ' '(空格,0x20),第 3 个字符是 '\b'(退格,0x8),下面分 3 步:
1、终端收到 '\b',光标左移 1 列,位于第 5 列,字母 'o' 处。
hello
2、终端收到 ' ',在光标出显示空格,于是把之前的 'o' 擦掉了,光标右移 1 列,位于第 6 列。
hell _
3、终端收到 '\b',光标左移 1 列,位于第 5 列。
hell_

使用特权

评论回复
7
poplaji|  楼主 | 2013-4-30 18:52 | 只看该作者
本帖最后由 poplaji 于 2013-4-30 18:54 编辑
john_lee 发表于 2013-4-30 14:53
看来光说不行了,非要举例才明白:
假设当前在终端上,从第1列开始有一串字符:hello,光标位于第 6 列,就 ...


谢谢了,这个两个"\b \b"彻底明白了!~

使用特权

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

本版积分规则

12

主题

62

帖子

0

粉丝