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

[复制链接]
6762|6
 楼主| poplaji 发表于 2013-4-30 00:05 | 显示全部楼层 |阅读模式
本帖最后由 poplaji 于 2013-4-30 00:53 编辑
  1. void Uart_GetString(char *string)    //该函数具有回送功能~
  2. {
  3.     char *string2 = string;
  4.     char c;
  5.     while((c = Uart_Getch())!=''''\r'''') //判断是否是回车符
  6.     {
  7.         if(c==''''\b'''') //如果是退格键
  8.         {
  9.             if( (int)string2 < (int)string )
  10.             {
  11.                 Uart_Printf("\b \b");
  12.                 string--;
  13.             }
  14.         }
  15.         else
  16.         {
  17.             *string++ = c;
  18.             Uart_SendByte(c);
  19.         }
  20.     }
  21.     *string=''''\0''
  22.     Uart_SendByte(''''\n''''); //回车换行
  23. }
这是一个串口接收字符串的函数,函数里面的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)的强制转换,纯粹是画蛇添足)。
 楼主| poplaji 发表于 2013-4-30 13:41 来自手机 | 显示全部楼层
john_lee 发表于 2013-4-30 09:39
为什么是 "\b \b",那纯粹是显示的需要,因为在 terminal 上,接收到一个 '\b',光标只会向左移动一格,而 ...

两个退格符,第一个左移一个格,但是不删除字符,第二个删除字符但是不左移,是这样么。你前面回答的左移和右移我有点没弄懂。
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_
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部