Python和C应用程序之间的串行端口数据传输(在Microblaze上运行)

时间:2018-09-05 01:49:25

标签: python c serial-port microblaze pyvisa

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

关于我的技能/背景的简要说明:RF /微波工程师,具有丰富的硬件经验和HDL经验,但是几乎没有软件经验,当然也没有C或python经验。

问题/问题

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

以下是描述uart_write函数的代码段:

*

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

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

  1. 我想知道在python端使用pyVISA接收通过串行端口传输的数据的最佳方法。当我使用ResourceManager()和openResource()打开端口时,我相应地设置了波特率,但是似乎无法“查询”设备。查询是一个pyVISA函数(?),它是在写入后进行读取的函数。在这种情况下,我希望发送命令“ frequency?”嵌入微火,我希望结果能传回去。如果我可以使用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,“ ASRL6 :: INSTR”,4(0x4),6(0x6),“ INSTR”,“ ASRL6 :: INSTR”,“ COM6”) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0781通话时间00:00:00.0000 状态:0(VI_SUCCESS)

  4. viOpen(0x00001001,“ ASRL6 :: INSTR”,0(0x0),0(0x0),0x00000001) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0792通话时间00:00:00.0657 状态:0(VI_SUCCESS)

  5. viParseRsrcEx(0x00001001,“ ASRL6 :: 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.0006   状态:0xBFFF0015( VI_ERROR_TMO
  2.   

我非常感谢您提供有关此问题的任何建议,并很高兴提供更多代码段/信息。也渴望获得有关礼节礼貌和改善职位要求的潜力的任何反馈

干杯

1 个答案:

答案 0 :(得分:0)

为了完整起见,我设法使用NIMAX来跟踪所有VISA事务,并使用VISA测试面板来实现工作状态,然后可以在代码中实现该解决方案

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

修复,我将设置波特率并读取终止的代码行移到了设备类中,以便在将设备定义为工具时,它会在发生任何交易之前设置这些属性。现在我可以读写了。

干杯