将std字符串转换为ascii char并通过串口c ++发送

时间:2016-01-26 10:59:05

标签: c++ arrays string char serial-port

我对c ++很新,这是我的问题: 我有一个std :: string,我想将每个字符转换为其Ascii符号,将它们放入一个unsigned char缓冲区并通过串口发送。我知道它不能这么清楚,所以我举一个例子:

std::string stringaStd = "010203";

我想通过串口发送序列:

'0' '1' '0' '2' '0' '3'

应该相当于:

0x30 0x31 0x30 0x32 0x30 0x33

因此,stringaStd的字符必须转换为Ascii,然后通过串口发送。 有什么想法怎么做?

谢谢!

2 个答案:

答案 0 :(得分:1)

ASCII是7位字符。有8位扩展(ANSI字符集,CP-1252,无论如何),但纯ASCII不使用最高位。网络传输可能会将其用作错误检测/纠正的奇偶校验标志,但我正在偏离主题。

char按标准定义至少为8位宽,即它绝对能够保存ASCII字符。

使用{/ 1}}中的<{p>}从字符串中检索单个char

std::string::operator[]

和,仅获取与ASCII相关的部分,并使用stringaStd[x]

0x7f

通常,代表ASCII字符时stringaStd[x] & 0x7f 中未使用的位被清除,但我不认为这在任何地方是标准化的。

整个过程可能会被整合成一个循环。可以使用异常(char),C-string空终止符(std::string::at或自C ++ 11,也std::string::c_str)或迭代器(基于范围的{{}来执行范围检查。 1}} - 环)
。 此外,使用提供的API与相应的串行端口进行交互,您就完成了。

答案 1 :(得分:0)

如果您的编译器使用ASCII来编码字符串(几乎可以肯定的话;我只是为了完整性而提到这一点),那么std::string对象中的字符已经是ASCII。无需转换。被视为数字的字符值'0'的值为0x30。试试吧:

char ch = '0';
std::cout << ch << ' ' << (int)ch << '\n';

要将这些ASCII值一次写入一个端口,只需执行以下操作:

std::string text("012345");
for (int i = 0 ;i < text.size(); ++i)
    send_to_port(text[i]);

如果您需要中间缓冲区,请再次执行:

unsigned char buf[80];
assert(text.size() <= 80);
std::copy(text.begin(), text.end(), buf);

使用char屏蔽0x7f值是错误的。如果字符串以某种方式具有非ASCII值(即,设置了高位的8位值),则屏蔽将清除高位,在有效ASCII字符的范围内生成一个值,但该值不代表任何有意义的值