需求:仪器上只有一个物理串口接口,但是仪器中有两个软件需要同时读取该串口的输入数据。最简单的方法是在硬件上实现串口的分路,但是老板想要保持硬件不变,在软件上解决这个问题。物理串口类型是RS232.
查了一些资料,总结下有两种方案:
1、写一个程序,将读到的物理串口数据不断写到一个外部文件中。当那两个软件需要运行时,从外部文件中读取数据;
2、利用虚拟串口:写一个程序,将读到的物理串口数据不断写到两个虚拟串口中。当那两个软件需要运行时,从两个虚拟串口中读取数据;
经过对比,选择方法二,因为我觉得方法二使用起来更方便,可以直接设置那两个软件的读取数据com口即可。具体的实现方式如下:
Step 1. 新建虚拟串口
什么是虚拟串口?
虚拟串口是相对于物理串口而言的,不需要物理上的串口就可以存在;
如何创建虚拟串口?
使用软件Configure Virtual Serial Port Driver,界面如下:
该软件使用非常简单,在Manage ports中选择com口,点击Add pair。在创建虚拟串口时,是成对创建的,该对串口默认相互连接。创建虚拟串口后,在设备管理器中可以看到:
其中com10是物理端口,com1/com2/com3/com4都是虚拟串口。
Step 2. 用labview读取com10接收到的数据,并写给com1和com3
什么是Labview?
Labview是NI公司出的一款编程软件,我觉得它有两个优点,一是容易实现PC与外部硬件的交互;二是图形化编程,适用于编写一些简单的程序。
如何用Labview将物理串口数据分发给虚拟串口?
程序流程如下:
1、配置com10、com1、com3口;
2、读取com10接收到的数据;
3、将com10接收到的数据发送给com1和com3;
4、循环执行步骤2和3;
5、关闭三个端口;
程序如下:
该程序的作用是,使得能够在com2和com4上同时读取到com10接收的数据。接收方式如下。
Step 3. 验证是否成功进行串口分配
用arduino mega发送串口数据到com10
我们选择外围电路mega给PC进行串口数据的发送。arduino程序如下:
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// prints title with ending line break
Serial.println("ASCII Table ~ Character Map");
}
// first visible ASCIIcharacter '!' is number 33:
int thisByte = 33;
// you can also write ASCII characters in single quotes.
// for example. '!' is the same as 33, so you could also use this:
//int thisByte = '!';
void loop() {
// prints value unaltered, i.e. the raw binary version of the
// byte. The serial monitor interprets all bytes as
// ASCII, so 33, the first number, will show up as '!'
Serial.write(thisByte);
Serial.print(", dec: ");
// prints value as string as an ASCII-encoded decimal (base 10).
// Decimal is the default format for Serial.print() and Serial.println(),
// so no modifier is needed:
Serial.print(thisByte);
// But you can declare the modifier for decimal if you want to.
//this also works if you uncomment it:
// Serial.print(thisByte, DEC);
Serial.print(", hex: ");
// prints value as string in hexadecimal (base 16):
Serial.print(thisByte, HEX);
Serial.print(", oct: ");
// prints value as string in octal (base 8);
Serial.print(thisByte, OCT);
Serial.print(", bin: ");
// prints value as string in binary (base 2)
// also prints ending line break:
Serial.println(thisByte, BIN);
// if printed last visible character '~' or 126, stop:
if(thisByte == 126) { // you could also use if (thisByte == '~') {
// This loop loops forever and does nothing
//while(true) {
// continue;
// }
thisByte = 32;
delay(3000);
}
// go on to the next character
thisByte++;
}
该程序可以使mega不断地给PC发送数据。
用PuTTY读取com2和com4
第一次用PuTTY,真的很强大,功能很多。读串口数据是功能之一。界面如下
只要在Serial中选择com口之后点击Open即可读取该端口数据。我们同时监视com2和com4,结果如下:
通过验证,发现用该方法可以实现物理串口到虚拟串口一对多分发。