QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)

Posted

技术标签:

【中文标题】QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)【英文标题】:QSerialPort::write() - only signed values? (127 decimal max)? I need to send 0xFF (255 dec) 【发布时间】:2013-10-22 10:56:30 【问题描述】:

这是我没想到的。我需要编写一个通过串行端口发送值的小应用程序,但值超过 127。在查看 Qt 文档时:http://qt-project.org/doc/qt-5.1/qtserialport/qserialport.html - 除非我遗漏了一些明显的东西,否则 QSerialPort::write() 方法不会似乎支持高于 127(十进制)的任何值。

例如,我碰巧需要发送 0xFF(十进制 255),所以当方法似乎只支持“签名”字符时,我该如何发送(同样,除非我遗漏了什么)。我正在寻找一个接受“int”或无符号字符的 write() 方法版本,它可以让我在十进制中达到 255。

virtual qint64  writeData(const char * data, qint64 maxSize)

看,没有“unsigned char *”也没有“int”,那么我如何发送一个包含 5 个值的数组,其中每个值都高于 127(十进制)?

【问题讨论】:

反正是个指针参数,谁在乎呢?随心所欲地投射它 - writeData() 无论如何都会发送它。 马丁是对的。它是一个指向数组的指针。创建一个数组,用你的数据调用 WriteData 填充,它就会消失。 嗯,你确定吗?我刚刚尝试了这个快速测试: char *ptr = new char[5];指针[0] = 255; ShowMessage((int)ptr[0]);我得到-1。当我将“unsigned”放在“char”前面并再次运行代码时,我得到 255。这非常重要。远端设备是投影仪和屏幕等,因此数据必须正确。 它正在发送原始字节,因此您可以像其他人写的那样随意解释它。 【参考方案1】:

它按原样发送数据,有符号或无符号是对方解释的问题。 -1 有符号字节为 0xff,与 255 无符号相同。

【讨论】:

【参考方案2】:

您仍然可以发送值高于 127 的字节。 有符号字符类型只是意味着您的数据作为有符号字符数组传递给方法(因此无符号 250 等于有符号 -6,但二进制均为 250)。

char *ptr = new char[5];指针[0] = 255; ShowMessage((int)ptr[0]);

从头开始:

首先查看这篇 wiki 文章:http://en.wikipedia.org/wiki/Two's_complement(专注于 8 位二进制补码整数表)

2 的补码是负值写入计算机内存的方式。

现在:

二进制代码中的值 255 写为 1111 1111。 2 的补码中的值 -1 也写为 1111 1111。

因此,char 的 unsigned 或 signed 类型会告诉您的编译器如何处理此值(作为有符号或无符号)。

现在,当您尝试从 char 或 unsigned char 转换为整数时会发生什么。

现在将 unsigned char 转换为 int: 您的编译器 1111 1111 视为 255 并将其转换为 255 整数。

现在将 char 转换为 int: 您的编译器 1111 1111 视为 -1 并将其转换为 -1 整数。

-1 整数的二进制代码与 -1 char 值不同(因为符号位)。

【讨论】:

谢谢!精彩的帖子。

以上是关于QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)的主要内容,如果未能解决你的问题,请参考以下文章

验证字符串是不是只有数字并且只有一定的长度

Python Pandas 检查字符串是不是只有“日期”或只有“时间”或“日期时间”

Python Pandas 检查字符串是不是只有“日期”或只有“时间”或“日期时间”

JQuery easyUI datagrid为啥查出来只有10条,而且只有一页 ,总的也只有10条

如何把一个EXCEL文档设置成只有我自己能修改,别人只能浏览的模式?

Vuejs:模板只有一个根元素,但编译失败说它应该只有一个根元素