0

我正在尝试使用我的 PC 上的 python 控制台来读取和写入在 microblaze 主机上运行的嵌入式 C 应用程序。两者之间的连接是通过 FTDI 芯片的 USB -> UART。

关于我的技能/背景的简要说明:RF/微波工程师,大量的硬件经验和大量的 HDL 经验,但是很少或没有软件经验,当然没有 C 或 python 经验。

问题/问题

  1. 我可以使用 PuTTy 或 Termite 控制台输入命令(例如“频率?”)并从函数接收预期的返回值。我什至可以使用函数的“设置”版本来设置值。在我的 C 应用程序中,uart_write_char 函数正在使用“putchar()”,我怀疑它只是打印字符和字符串,而不是“传输”数据(字节、双精度、浮点数等)。

这是描述 uart_write 函数的代码片段:

*

void uart_write_char(char data)
{
    putchar(data);
}

*我想知道“打印”数据到控制台和“传输”数据到另一端之间是否有区别,所以我可以接收它并将其转储到文件中。

  1. 我想知道在我的 python 端使用 pyVISA 接收通过串口传输的数据的最佳方法。在我使用 ResourceManager() 和 openResource() 打开端口的那一刻,我相应地设置了波特率,但是我似乎无法“查询”设备。查询是一个 pyVISA 函数(?),它是先写后读。在这种情况下,我希望发送命令“频率?” 到嵌入式 microblaze,我希望结果会被传回。如果我可以使用 PuTTy 或 Termite 等控制台成功完成此操作,那么使用 pyVISA 查询功能有什么区别?也许编码?

编辑:我还尝试了https://media.readthedocs.org/pdf/pyvisa/1.6/pyvisa.pdf中记录的 query_ascii_value() 和 query_binary_value() 结果仍然相同,我在 python 中收到超时错误安慰。

更新我已经使用 NI-MAX 来捕获 Trace IO,并且超时似乎在读取端。如果我连接到设备,我假设它会完成写入功能,这是真的吗?这是 Ni-MAX 日志

  1. viOpenDefaultRM (0x00001001) 进程 ID:0x000082C8 线程 ID:0x00006F90 开始时间:15:21:12.0642 调用持续时间 00:00:00.0139 状态:0 (VI_SUCCESS)

  2. viClose (0x00000000) 进程 ID:0x000082C8 线程 ID:0x00006F90 开始时间:15:21:12.0781 调用持续时间 00:00:00.0000 状态:0x3FFF0082 (VI_WARN_NULL_OBJECT)

  3. viParseRsrcEx (0x00001001, "ASRL​​6::INSTR", 4 (0x4), 6 (0x6), "INSTR", "ASRL​​6::INSTR", "COM6") 进程 ID: 0x000082C8 线程 ID: 0x00006F90 开始时间: 15:21 :12.0781 通话时间 00:00:00.0000 状态:0 (VI_SUCCESS)

  4. viOpen (0x00001001, "ASRL​​6::INSTR", 0 (0x0), 0 (0x0), 0x00000001) 进程 ID: 0x000082C8 线程 ID: 0x00006F90 开始时间: 15:21:12.0792 调用持续时间 00:00:00.0657 状态: 0 ( VI_成功)

  5. viParseRsrcEx (0x00001001, "ASRL​​6::INSTR", 4 (0x4), 6 (0x6), "INSTR", NULL, NULL) 进程 ID: 0x000082C8 线程 ID: 0x00006F90 开始时间: 15:21:12.1450 调用持续时间 00:00 :00.0000 状态:0 (VI_SUCCESS)

  6. viWrite (ASRL6::INSTR (0x00000001), "tx_lo_freq?...", 14 (0xE), 14 (0xE)) 进程 ID: 0x000082C8 线程 ID: 0x00006F90 开始时间: 15:21:24.5897 调用持续时间 00:00: 00.0000 状态:0 (VI_SUCCESS)

  1. viRead (ASRL6::INSTR (0x00000001), 0x000001DF461F5420, 20480 (0x5000), 0 (0x0)) 进程 ID: 0x000082C8 线程 ID: 0x00006F90 开始时间: 15:21:24.5897 调用持续时间 00:00:02.01500 00:00: 02.0500 )

我很感激有关此问题的任何建议,并很高兴提供更多代码片段/信息。也热衷于任何关于帖子礼仪的反馈以及改进帖子请求的潜力

干杯,

4

1 回答 1

0

为了完整起见,我设法制定了一个解决方案,使用 NIMAX 来跟踪所有 VISA 交易和 VISA 测试面板以实现工作状态,然后我可以在我的代码中实现

问题:我在仪器类定义中设置波特率和读/写终止字符,但它们从未实现。看来我正在尝试使用 BAUD=9600 的默认设置和不正确的读取终止进行查询。

修复,我将设置波特率和读取终止的代码行移动到我的设备类中,这样当我将设备定义为仪器时,它会在任何事务发生之前设置这些属性。现在我可以读写了。

干杯,

于 2018-09-07T01:30:38.600 回答