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

Python和C应用程序之间的串行端口数据传输(在Microblaze上运行),python,c,serial-port,microblaze,pyvisa,Python,C,Serial Port,Microblaze,Pyvisa,我正在尝试使用PC上的python控制台来读取和写入运行在microblaze主机上的嵌入式C应用程序。两者之间的连接是通过FTDI芯片的USB->UART 关于我的技能/背景的简要说明:射频/微波工程师,有大量的硬件经验和HDL经验,但几乎没有软件经验,当然没有C或python方面的经验 问题/问题: 我可以使用PuTTy或Termite控制台输入命令(例如“频率”),并从函数接收预期的返回值。我甚至可以使用函数的“set”版本设置值。在我的C应用程序中,uart_write_char函数使用

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

关于我的技能/背景的简要说明:射频/微波工程师,有大量的硬件经验和HDL经验,但几乎没有软件经验,当然没有C或python方面的经验

问题/问题

  • 我可以使用PuTTy或Termite控制台输入命令(例如“频率”),并从函数接收预期的返回值。我甚至可以使用函数的“set”版本设置值。在我的C应用程序中,uart_write_char函数使用的是“putchar()”,我怀疑它只是打印字符和字符串,而不是“传输”数据(字节、双精度、浮点等)
  • 下面是一段描述uart_写入函数的代码:

    *

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

  • 我想知道在python端使用pyVISA接收通过串行端口传输的数据的最佳方法。当我使用ResourceManager()和openResource()打开端口时,我相应地设置了波特率,但是我似乎无法“查询”设备。查询是一个pyVISA函数(?),它是一个先写后读的函数。在这种情况下,我希望将命令“频率”传输到嵌入式微博客,并希望将结果传输回来。如果我可以使用PuTTy或Termite这样的控制台成功地做到这一点,那么使用pyVISA查询函数有什么区别?也许是编码
  • 编辑:我还尝试了查询ascii值()和查询二进制值(),如中所述 结果仍然是一样的,我在python控制台中收到一个超时错误

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

  • viOpenDefaultRM(0x00001001) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0642通话持续时间00:00:00.0139 状态:0(VI_成功)

  • 维克洛斯(0x00000000) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0781通话持续时间00:00:00.0000 状态:0x3FFF0082(VI\u警告\u空\u对象)

  • 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_成功)

  • viOpen(0x00001001,“ASRL6::INSTR”、0(0x0)、0(0x0)、0x00000001) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0792通话持续时间00:00:00.0657 状态:0(VI_成功)

  • 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_成功)

  • 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_成功)

  • viRead(ASRL6::INSTR(0x00000001)、0x000001df461f542020480(0x5000)、0(0x0)) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:24.5897通话持续时间00:00:02.0006 状态:0xBFFF0015(VI_错误\u TMO
  • 我非常感谢关于这个问题的任何建议,并很高兴提供更多的代码片段/信息。同时也渴望得到关于职位礼仪和改进职位要求潜力的任何反馈


    干杯,

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

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

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

    干杯

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