Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用glib通过USB向FTDI设备发送原始字节_C_Communication_Glib_Uart_Ftdi - Fatal编程技术网

C 使用glib通过USB向FTDI设备发送原始字节

C 使用glib通过USB向FTDI设备发送原始字节,c,communication,glib,uart,ftdi,C,Communication,Glib,Uart,Ftdi,我正在使用GTK+2.0 GUI在C中开发一个简单的应用程序,当然,在Linux上,这个应用程序是设计用来控制通过USB端口连接的设备,并使用FTDI驱动程序通过USB端口模拟RS232异步协议 我正在使用函数g\u io\u channel\u write\u chars()向设备发送数据。问题是我发送的序列包含许多ASCII值,但与任何(可见)字符都不匹配 例如,当我发送\x40\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01时,它将不

我正在使用GTK+2.0 GUI在C中开发一个简单的应用程序,当然,在Linux上,这个应用程序是设计用来控制通过USB端口连接的设备,并使用FTDI驱动程序通过USB端口模拟RS232异步协议

我正在使用函数
g\u io\u channel\u write\u chars()
向设备发送数据。问题是我发送的序列包含许多ASCII值,但与任何(可见)字符都不匹配

例如,当我发送
\x40\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01
时,它将不起作用。程序将因错误而停止

GLib:ERROR:/build/buildd/glib2.0-2.34.1//GLib/giochannel.c:2382:g_io_channel_write_chars:不应到达代码
Przerwane(堆芯转储)

如果我使用
sprintf
函数将此序列放入表中,则只会复制前两个值,并且此序列将发送到设备,不会出现错误


然后我的问题是,我如何向设备发送任何字节。对于这个问题,是否有一个等价的
g\u io\u channel\u write\u chars()
?我一直在研究GIOChannel的文档,没有发现类似的东西。非常感谢您的帮助。

您需要确保频道不会认为它正在发送文本。您所遇到的崩溃可能是由于GIO试图根据其频道编码的想法验证您的数据

请注意,默认编码是UTF-8,并且由于并非所有字节序列都是有效的UTF-8,这很容易导致随机二进制数据的验证失败

使用参数
NULL
调用,这将使二进制数据安全:

编码
NULL
可以安全地用于二进制数据


你需要确保频道不认为它在发送文本。您所遇到的崩溃可能是由于GIO试图根据其频道编码的想法验证您的数据

请注意,默认编码是UTF-8,并且由于并非所有字节序列都是有效的UTF-8,这很容易导致随机二进制数据的验证失败

使用参数
NULL
调用,这将使二进制数据安全:

编码
NULL
可以安全地用于二进制数据


我不知道g_io_channel_write_chars;但是sprintf的“问题”是您无法使用该函数正确复制包含\x00的数据。相反,使用memcpy;你说的“桌子”是什么意思?根据答案,您可能根本不需要memcpy。我所说的table是指“array”,很抱歉这是一个词汇错误(我不是英语母语)。我注意到sprintf跳过了\x00和\x01等,这就是为什么我创建了这些元素的数组,试图发送它,但它崩溃了。sprintf应该与C-string一起使用。C字符串以null结尾:这意味着在找到字节“\x00”时可以识别字符串的结尾,因此无法使用它正确处理包含null字节的数据。您可以使用
memcpy(dest,“\x40\x40\x00…”,13)
或类似方法复制阵列中的数据当然,不幸的是,这并不能解决发送原始数据的问题(即
g\u io\u channel\u write\u chars()
崩溃的事实)我不知道g\u io\u channel\u write\u chars;但是sprintf的“问题”是您无法使用该函数正确复制包含\x00的数据。相反,使用memcpy;你说的“桌子”是什么意思?根据答案,您可能根本不需要memcpy。我所说的table是指“array”,很抱歉这是一个词汇错误(我不是英语母语)。我注意到sprintf跳过了\x00和\x01等,这就是为什么我创建了这些元素的数组,试图发送它,但它崩溃了。sprintf应该与C-string一起使用。C字符串以null结尾:这意味着在找到字节“\x00”时可以识别字符串的结尾,因此无法使用它正确处理包含null字节的数据。您可以使用
memcpy(dest,“\x40\x40\x00…”,13)
或类似方法复制阵列中的数据。当然,不幸的是,这并不能解决发送原始数据的问题(事实是
g_io_channel_write_chars()
崩溃)