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

2024-06-26 13:41:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

问题:

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

下面是一段描述uart\ U写函数的代码:

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

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

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

编辑:我还尝试了查询ascii值()和查询二进制值(),如https://media.readthedocs.org/pdf/pyvisa/1.6/pyvisa.pdf中所述 结果仍然是一样的,我在python控制台中收到一个超时错误。你知道吗

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

  1. viOpenDefaultRM(0x00001001) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0642通话时长00:00:00.0139 状态:0(成功)

  2. 维克洛斯(0x00000000) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0781通话时长00:00:00.0000 状态:0x3FFF0082(VI\u WARN\u NULL\u OBJECT)

  3. viparserrcex(0x00001001,“ASRL6::INSTR”,4(0x4),6(0x6),“INSTR”,“ASRL6::INSTR”,“COM6”) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.0781通话时长00:00:00.0000 状态:0(成功)

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

  5. viparserrcex(0x00001001,“ASRL6::INSTR”,4(0x4),6(0x6),“INSTR”,NULL,NULL) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:12.1450通话时长00:00:00.0000 状态:0(成功)

  6. viWrite(ASRL6::INSTR(0x00000001),“tx\U lo\U freq?…”,14(0xE),14(0xE)) 进程ID:0x000082C8线程ID:0x00006F90 开始时间:15:21:24.5897通话时长00:00:00.0000 状态:0(成功)

  1. viRead (ASRL6::INSTR (0x00000001), 0x000001DF461F5420, 20480 (0x5000), 0 (0x0)) Process ID: 0x000082C8 Thread ID: 0x00006F90 Start Time: 15:21:24.5897 Call Duration 00:00:02.0006 Status: 0xBFFF0015 (VI_ERROR_TMO)

我很感激任何关于这个问题的建议,并很高兴提供更多的代码片段/信息。也渴望得到任何关于岗位礼仪和改进岗位要求潜力的反馈

干杯


Tags: 数据函数id进程状态时间经验线程
1条回答
网友
1楼 · 发布于 2024-06-26 13:41:42

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

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

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

干杯

相关问题 更多 >