pcommlite串口通讯库使用

MFC 下串口编程使用最多的两种方法是读取注册表和使用 mscomm 组件 , 都有着或多或少的缺陷 , 调用系统 SDK 比较麻烦 , MSCOMm 组件最多支持 16 个串口 , 串口号大于 16 的时候无法打开 , 遇到这种情况 , 可以使用一个名为 pcommlite 的串口通讯库 , 下载安装之后 , 解压出来的文件包括

根据编译的平台选择相应的lib文件加入工程,并加入pcomm.h文件

 

1.      寻找系统串口,sio_open()打开串口 sio_close()关闭串口

2.      BYTE i = 0;

3.      CString str;

4.      // TODO: 在此添加控件通知处理程序代码

5.      ((CComboBox *)this->GetDlgItem(IDC_COMBO_Serial_Num_Select))->ResetContent();

6.      for (= 0;< 255;i++)

7.      {//此程序支持255个串口

8.          if(SIO_OK == sio_open(i))

9.          {

10.            sio_close(i);

11.            str.AppendFormat("COM%d",i);

12.            ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->AddString(str);

13.            str.Empty();

14.        }

15.    }

16.    i = ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->GetCount();

17.    if(==0)

18.    {

19.        GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(FALSE);

20.    }

21.    else

22.    {

23.        GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(TRUE);

24.    }

 

2.打开串口,各种库宏定义

    switch(comBaud)

        {

        case 0:

           m_comBaud = B1200;

            break;

        case 1:

           m_comBaud = B2400;

            break;

        case 2:

           m_comBaud = B4800;

            break;

        case 3:

           m_comBaud = B9600;

            break;

        case 4:

           m_comBaud = B19200;

            break;

        case 5:

           m_comBaud = B38400;

            break;

        case 6:

           m_comBaud = B57600;

            break;

        case 7:

            m_comBaud= B115200;

            break;

        case 8:

           m_comBaud = B230400;

            break;

        }

        switch(comStopBit)

        {

        case 0:

           m_comStopBit = STOP_1;

            break;

        case 1:

           m_comStopBit = STOP_2;

            break;

        }

        switch (comDataLength)

        {

        case 0:

           m_comDataLength = BIT_5;

            break;

        case 1:

           m_comDataLength = BIT_6;

            break;

        case 2:

           m_comDataLength = BIT_7;

            break;

        case 3:

           m_comDataLength = BIT_8;

            break;

        }

        switch(comCheckSum)

        {

        case 0:

           m_comChecksum = P_NONE;

            break;

        case 1:

           m_comChecksum = P_ODD;

            break;

        case 2:

           m_comChecksum = P_EVEN;

            break;

        }

        config = m_comDataLength|m_comStopBit|m_comChecksum;

        //开始串口配置

        if( sio_open(m_comPort) != SIO_OK)

        {

           MessageBox("串口打开失败","提示",MB_OK);

            this->serialsIsOpen = false;

           m_comPort = 0;

            return;

        }

       sio_flowctrl(m_comPort,0x00);//关闭硬件流控制

        sio_lctrl(m_comPort,0x00);//关闭RTS DTR

        sio_ioctl(m_comPort,m_comBaud,config);

        sio_flush(m_comPort,2);

        this->GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->SetWindowText("关闭串口");

        GetDlgItem(IDC_COMBO_Serial_Num_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Baud_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Data_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Parity_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Stop_Select)->EnableWindow(FALSE);

        this->serialsIsOpen = true;

    }

 

3.串口发送数据 sio_lstatus() sio_write()

//检查串口是否打开,打开就发送

    if(serialsIsOpen == true)

    {

        //变量打开了,要去测试串口状态

        if(sio_lstatus(m_comPort)>= 0)

        {

            CStringstr1;

           sendString.Empty();

            //没有对\r\n特殊处理

            ((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(str1);

           sendString.AppendFormat("%s",str1);

           sio_write(m_comPort,sendString.GetBuffer(),sendString.GetLength());

        }

        else

        {

            //说明串口已经丢失

           MessageBox("串口丢失,请关闭后重新打开","错误",MB_OK);

        }

    }

    else

    {

        //说明串口已经丢失

        MessageBox("请先打开串口","错误",MB_OK);

    }

4.设定定时器,用于串口接收数据

5.在定时器中接收数据 sio_read()

void CLPC1768_PAD_OTG_DebugDlg::SerialsProcessBuffer( void )

{

    serialReadTemp.Empty();

    if(m_comPort > 0 && this->serialsIsOpen == true)

    {

        char readBuffer[1024] = {0};

        //      sio_flush(m_comPort,1);

        int length = sio_read(m_comPort,readBuffer,1024);

        if(length > 0)

        {

            for(int i = 0; i < length; i++)

            {

               serialReadTemp.AppendChar(readBuffer[i]);

            }

        }

    }

}

 

该库还有很多借口用于控制DTRRTS,使用方便,详情查看帮助文档

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PComm 函数 PComm 函数是台湾MOXA公司提供的,他为用户提供了基于win32 api的开发接口。 PComm函数分为7大类 控制函数、数据输入函数、数据输出函数、状态函数、事件驱动函数、传输文件函数、特殊设定函数 上述函数均返回int型数据,若函数调用成功则返回0,否则返回一个负整数。 控制函数主要包括 sio_open(PortNum) 打开串口 sio_close(PortNum) 关闭串口 sio_ioctl(PortNum, baud, mode)设置串口的工作模式,包括 波特率,数据位元,停止位,效验等 sio_flush(portNum,func)清除发送、接收缓冲区 其中func 为0清空输入 ,为1清空输出,为2清空输入输出 sio_SetWriteTimeouts(int port,DWORD TotalTimeouts):设置串口写操作的超时。 sio_lctrl(Portnum,mode) 设置串口RTS/DTS。 待定 数据输入函数主要包括 sio_getch(PortNum) 从输入缓冲区读一个字符 sio_read(PortNum,buf,len) 从输入缓冲区读指定个数的字符 sio_iqueue(Portnum)读取输入缓冲区中的字符长度 数据输出函数主要包括 sio_putch(PortNum) 写一个字符到输出缓冲区 sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区 状态函数主要包括 sio_lstatus(portNum)获取串口的CTS,DSR,DCD,RI线的状态 sio_getbaud(portNum)获取串口的波特率 sio_getmode(portNum)获取串口的工作模式。对应sio_ioct函数 事件函数主要包括 sio_term_irq(portNum,func,code) 当接收到指定字符时响应事件,func为回调函数名,code为指定的字符 sio_cnt_irq(PortNum,func,count) 当接收到指定个数字元时响应事件,func为回调函数名,count接收的个数 传输文件函数主要包括 sio_FtASCIITx(portNum,fname,func,key)发送一个文本文件 sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一个文本文件 int i,Ret,DataLen; FILE *fp1; uchar RetDataC[30],WriteData[24],PSC[5]; Ret = sio_open(port); if (Ret != SIO_OK ) return(-1);//打开串口错误 Ret = sio_ioctl (port, B9600, P_NONE | BIT_8 | STOP_1 ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 } /*Ret = sio_lctrl (port, C_DTR | C_RTS ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 }*/ /*Ret = sio_flush(port,2); if (Ret != SIO_OK){ sio_close(port); return(-3);//清空 输入和输出缓冲区的数据 }*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值