将标准字符串转换为 ascii 字符并通过串行端口 c++ 发送



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

std::string stringaStd = "010203";

我想通过串行端口发送序列:

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

这应该等效于:

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

因此,stringaStd 的字符必须转换为 Ascii,然后通过串行端口发送。知道如何做到这一点的任何想法?

谢谢!

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

根据标准定义,char至少具有 8 位宽,即它绝对能够容纳 ASCII 字符。

使用std::string::operator[]从字符串中检索单个char,如

stringaStd[x]

并且,要仅获取与 ASCII 相关的部分,并且带有 0x7f

stringaStd[x] & 0x7f

通常,在表示 ASCII 字符时,char中未使用的位会被清除,但我认为这在任何地方都没有标准化。

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

如果您的编译器使用 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);

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

最新更新