【问题标题】:Using glib to send raw bytes to an FTDI device over USB使用 glib 通过 USB 将原始字节发送到 FTDI 设备
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多