各位工程项目的高手们,本人最近在利用串口接收和发送数据。
本人之前写好了一个程序,可以向任意标准RS-232串口设备发送数据
和 接收连接到计算机机箱后com端口的数据。
本人用上了CSerialPort类,没有用上VC的MSCOM。操作系统是WindowsXP,台式机。现在本人有一个疑问,
在一般的台式计算机内,机箱后配有2个串口 com1  and  com2,
一般我在做通信的时候就用上一个串口而已,现在因为需要,所以打算实现以下功能:
1. 外部设备A连接至com1,并向com1发送数据;2. com1得到数据后,进行2个操作:
   先把数据存入磁盘,
   再从com2把数据发送出去,传达至设备B,设备B与com2相连,被动接收。
3. 我的问题在于,如何在同一个程序内实现以上功能?
之前我在程序内按如下代码实现,只声明了一个CSerialPort m_SerialPort; if (m_SerialPort.InitPort(this, m_nCom, m_nBaud, m_cParity, m_nDatabits,
m_nStopbits, m_dwCommEvents, 512))
{
m_SerialPort.StartMonitoring();// 开始监视
                  ……
         }是不是要声明2个CSerialPort 对象才可以?
还请高手们指点!!

解决方案 »

  1.   

    应该要创建两个串口对象分别绑定到COM1和COM2。
    异步监听串口数据,收到后进行处理。在一个程序内部完全可以实现的
      

  2.   

    建立两个对象,一个处理com1,一个处理com2,数据交互通过内存等来交互...
      

  3.   

    楼上各位看法与我的看法略同,但是有一个问题:我用的CSerialPort类,是经过 龚建伟博士改编的,里边处理了一些内存泄露之类的小bug,并且可以往串口发送ASCII码为0 的字符。我参考了  龚建伟博士的 《VC++串口通信编程与实践》
    发现里边有这么一个说法:“原类经过修改后,单串口通信没问题了,但是在进行多串口通信的时候,打开串口,然后关闭,再打开就会发现有异常!”为此,本人今天做了个验证,用上2个不同的CSerialPort对象,分别进行
    InitPort
    StartMonitoring
    ClosePort
    但是发现通信很正常,是不是本人对 书中作者的话理解不到位?
    不知各位高手看法如何?
      

  4.   

    但问题在于怎么找到作者…… 另外,如果不用CSerialPort这个类,那我用VC内的MSCOMM控件,那么应该如何进行以下一段字符的发送?0x31 0x41 0x53 0x53 0x00 0xff 0xcc
    如果声明了一个MSCOMM对象
    那么可以利用如下语句进行发送 UpdateData(TRUE); //读取编辑框内容
    m_ctrlMSCommCOM1.SetOutput(COleVariant(m_strEditCOM1TXData));//发送数据

    但要发送的数据中间出现了ASCII码为0的字符 和 255的字符,如果当作一个字符串去发送那么就只能得到1ASS
    0x00之后的字符都发送不过去了,请问这种情况怎么处理?
      

  5.   

    可以用类似base64编码的方式将二进制数据转换为字符串来传输,你可以网上搜索一下。
      

  6.   

    想到一个办法,用数组传递的方式,而不按字符串的方式传递,这样就可以保证把0x00
    0xff之类的数据传输过去了。一楼的朋友所说的  异步监听串口数据 是什么意思呢?
    二楼的朋友所说的  利用循环指针可以很容易的解决   为什么要用循环指针?有必要吗? 
      

  7.   


    恩,我在代码的确没有这样做。
    我只是在操作按钮,在对话框里边定义了2个按钮
    打开 按钮里边执行
    if (m_SerialPort.InitPort(this, m_nCom, m_nBaud, m_cParity, m_nDatabits, 
    m_nStopbits, m_dwCommEvents, 512)) 

    m_fOpen = true;
    m_SerialPort.StartMonitoring();// 开始监视 
                      …… 
    而关闭 按钮里边 执行
    if(m_fOpen)
    m_SerialPort.ClosePort();// 开始监视 
    我就循环地操作这2个按钮,让串口关闭 -> 打开 -〉 再关闭 -〉再打开……都没发现问题,看来是理解的方向不同。