我有一个在 ISE 设计工具包上模拟和合成的 Verilog 代码。我有一个用于实现的 FPGA spartan 6 设备。但是设备存在问题(可能是电源问题),当我将设备连接到我的 PC 时,它在任何 COM 端口中都不可用。所以我想检查我为通过设备进行串行通信而制作的 Matlab 代码是否能完成所需的工作。所以我需要一种方法来通过任何 COM 端口测试串行通信,而无需将串行 com 设备连接到 PC。有没有这样的方法可以将 Matlab 的 Rx 串行数据发送到 COM 端口?任何软件或任何其他方法将不胜感激:)
2 回答
我找到了一种使用虚拟串行端口测试 Matlab 串行通信的方法。
从以下网址下载“免费虚拟 COM 端口模拟器”:http: //freevirtualserialports.com/
我将它安装在 Windows 10 中,它正在工作(作为试用版)。
执行以下 Matlab 代码示例以验证其是否正常工作:
s3 = serial('COM3','BaudRate',115200);
s4 = serial('COM4','BaudRate',115200);
fopen(s3);
fopen(s4);
fwrite(s3, uint8([1, 2, 3, 4, 5]));
%fprintf(s3, '12345');
pause(0.1);
RxBuf = fread(s4, 5)
fclose(s3);
delete(s3);
clear s3
fclose(s4);
delete(s4);
clear s4
输出是:
RxBuf =
1
2
3
4
5
绕过问题“它只停留在一个测试会话中”。
使用该软件创建一对虚拟端口时存在一个问题,它只保留一个测试会话。
我猜这是COM端口仿真软件的问题。
以下解决方案不是一个好的做法(也不是真正的解决方案)。
- 将串行对象声明为
global
,保持对象持久化。 - 仅在未创建时才创建串行对象。
- 不要删除也不要清除串行对象。
请参阅以下代码示例:
global s3 s4
if isempty(s3)
s3 = serial('COM3','BaudRate',115200);
end
if isempty(s4)
s4 = serial('COM4','BaudRate',115200);
end
fopen(s3);
fopen(s4);
fwrite(s3, uint8([1, 2, 3, 4, 5]));
pause(0.1);
RxBuf = fread(s4, 5)
fclose(s3);
%delete(s3);
%clear s3
fclose(s4);
%delete(s4);
%clear s4
您还可以寻找更好的虚拟 COM 端口软件。
正如 Rotem 建议的那样,如果您需要通过 PC 的 2 个程序之间的串行线路进行通信,您需要一个虚拟 COM 端口仿真器。
您似乎在 Windows 操作系统上运行,所以我会推荐一个完全免费的模拟器(不是试用版)。对于 Windows,我使用com0com Null-modem 模拟器(来自SourceForge)。
在下面的示例中,我将展示如何与“另一个”设备通信,因此 Matlab 不会处理通信的双方。另一个设备将由一个简单的终端模拟。对于 Windows,我使用RealTerm:串行/TCP 终端(也来自SourceForge)。
设置:
使用所有默认选项执行两个程序的设置。默认情况下com0com将创建一个虚拟对COM3/COM4
,但如果您的系统上已经存在这些端口,则程序可能会分配其他编号。在运行示例之前检查数字。(它也会创建一CNCA0/CNCB0
对,但你现在可以忽略这个)。
对于RealTerm,一旦安装(不要忘记在安装结束时激活服务器注册,默认情况下应该勾选它),它将如下所示。保留所有默认选项,如果需要更改,只需设置端口号和波特率。
测试 MATLAB -> 终端
您已准备好将 Ascii 字符或二进制值从 MATLAB 发送到您的设备。下面的动画向您展示了这两个选项的示例:
您可以单击图片以查看其全尺寸。它正在循环运行,因此您可能需要等到它从头开始重新启动。
测试终端 -> MATLAB
当您发送 Ascii 字符并希望在 MATLAB 上使用格式说明符时[CR]
[LF]
,不要忘记勾选RealTerm'%s'
,因为它需要这些字符来检测字符串的结尾。
笔记:
- 如果您还有另一个更常用的终端程序,它的工作方式也一样。
- 如果RealTerm选项不适合您,或者您想处理来自 Matlab 的通信双方,那么您可以使用 Rotem 在他的第一个答案中提供的代码。只需安装com0com但忽略所有RealTerm部分。