2010-12-19 31 views
0

您好,我正在编写一个库,用于通过rs-232串行连接与外部设备进行通信。如何保证字符的位数和与外部设备的通信短小

通常我必须传递一个包含8位= 1字节字符或16位= 2字节数的命令。我如何以便携式的方式做到这一点?

主要问题

从阅读其他问题似乎标准不保证1字节= 8比特, 在

的基本存储单元(标准$ 1.7/1中定义) + ++内存模型是字节。字节是至少大到足以包含 基本执行 字符集的任何成员,并且由比特的 连续序列,所述 数目为 实现定义

如何保证字符的位数?我的设备准确地预计8位,而不是至少8位。

我意识到几乎所有的实现都有1byte = 8位,但我很好奇如何保证它。

短期> 2字节的校验

我希望你不介意,我也想运行我提出了简短的解决方案 - 通过你> 2字节的转换。我是字节转换和跨平台可移植性的新手。

为了保证短期我想我会需要需要

  1. 做的sizeof(短)的字节数。如果sizeof(short)= 2转换为字节并检查字节排序(如here

  2. 如果sizeof(short)> 2则将short转换为字节,检查字节排序(如here),然后检查最重要的字节是空的并删除它们?

    这是正确的做法?有没有更好的办法?

非常感谢

回答

2

据我所知,与串口通信是某种平台/操作系统相关的,所以当你写它的低水平的部分,你会很清楚的平台,它的字节顺序和CHAR_BIT。这样的问题没有任何意义。另外,不要忘了UART硬件能够传输7或8位字,因此它不依赖于系统架构。

编辑:我提到,UART的字是固定的(让我们考虑模式3与8位,作为最标准),硬件本身不会给它一个send命令发送多于8位,所以,它将发送正好8位,而不管机器的CHAR_BIT。这样,通过使用byte一个单一send

unsigned short i; 
send(i); 
send(i>>8); 

你可以肯定它会做正确的事情。
另外,一个好主意是看看boost.asio究竟在做什么。

+0

是的,我认为你的权利。我正在使用boost.asio库来进行低级别通信,所以这不会发生在我身上。 char = 16位系统上的用户是否会无法使用该库?如果我要求它发送字母'a',这将是我设备预期的位数的两倍? – Tom 2010-12-19 10:07:30

+0

@Tom:我已经更新了我的答案。 – ruslik 2010-12-19 10:15:02

+0

谢谢,我仍然有点困惑(抱歉)。所以从char = 16位实现:char c ='a';发送(C);会发送一半的角色?是可以将16位字符转换为8位来发送我的设备期望的位? – Tom 2010-12-19 10:26:30

1

This thread似乎建议您可以使用CHAR_BIT<climits>This page甚至暗示8是char中的最小位数......不知道标准中的引用与此有关。

对于固定大小的整数类型,如果使用MSVC2010或GCC,可以依靠C99的<stdint.h>(甚至在C++),以限定(u)int8_t(u)int16_t被保证是宽分别正好是8位和16位。

1

CHAR_BIT from <climits> header告诉你char中的位数。这是至少 8.另外,short int使用至少16位的值表示。这是由最小值范围内保证:

type    can at least represent 
--------------------------------------- 
unsigned char    0...255 
signed char   -127...127 
unsigned short   0...65535 
signed short   -32767...32767 
unsigned int    0...65535 
signed int   -32767...32767 

看到here

对于便携性,每当我写的,它依赖于CHAR_BIT == 8的代码,我只是写:

#include <climits> 

#if CHAR_BIT != 8 
#error "I expect CHAR_BIT==8" 
#endif 

正如你说,几乎所有的平台都是如此,如果不是特殊情况,它不会编译。这对我来说足够便携。 :-)

+0

是的,我喜欢你的尺寸检查。我会用这个,谢谢。 – Tom 2010-12-19 10:22:33