【发布时间】:2013-05-22 07:32:22
【问题描述】:
我正在用 GTK+2.0 GUI 用 C 语言开发一个简单的应用程序,当然,在 Linux 上,这个应用程序旨在控制通过 USB 端口连接的设备,并使用 FTDI 驱动程序通过 USB 模拟 RS232 异步协议港口。
我正在使用函数g_io_channel_write_chars() 向设备发送数据。问题是我发送的序列包含很多 ASCII 值,但不匹配任何(可见)字符。
例如,当我发送\x40\x40\x00\x01\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: code should not be reached
Przerwane (core dumped)
如果我使用sprintf 函数将此序列放入表中,则只会复制前两个值,并且此序列将被发送到设备而不会出错。
那么我的问题是,我怎样才能向设备发送任何字节。是否有相当于g_io_channel_write_chars() 的东西?我一直在研究 GIOChannel 的文档,但没有找到类似的东西。非常感谢您的帮助。
【问题讨论】:
-
我不知道 g_io_channel_write_chars;但 sprintf 的“问题”是您不能使用该函数正确复制包含 \x00 的数据。相反,使用 memcpy; “桌子”是什么意思?根据答案,您可能根本不需要 memcpy。
-
表格我的意思是“数组”,抱歉这是一个词汇错误(我不是以英语为母语的人)。我注意到 sprintf 跳过了 \x00 和 \x01 等,这就是为什么我创建了这些元素的数组,试图发送它但它崩溃了..
-
sprintf 旨在与 C 字符串一起使用。 C-string 是空终止的:这意味着当找到一个字节 '\x00' 时识别字符串的结尾,因此您不能使用它来正确处理包含空字节的数据。您可以使用
memcpy(dest, "\x40\x40\x00...", 13)或类似方法复制数组中的数据 -
是的,当然,不幸的是它并没有解决问题,即发送原始数据(
g_io_channel_write_chars()崩溃的事实)
标签: c communication glib uart ftdi