专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

用Labview将一路物理串口分成多路虚拟串口

作者:蒸铮日上   来源:蒸铮日上   点击数:  更新时间:2014年06月10日   【字体:

需求:仪器上只有一个物理串口接口,但是仪器中有两个软件需要同时读取该串口的输入数据。最简单的方法是在硬件上实现串口的分路,但是老板想要保持硬件不变,在软件上解决这个问题。物理串口类型是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、关闭三个端口;
 
程序如下:





若想要下载该程序,下载链接如下:http://pan.baidu.com/s/1mgmfo9q
 
该程序的作用是,使得能够在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,结果如下:

通过验证,发现用该方法可以实现物理串口到虚拟串口一对多分发。
关闭窗口

相关文章