• 20924阅读
  • 26回复

串口通信升级版 [复制链接]

上一主题 下一主题
离线suntech
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-03
— 本帖被 XChinux 执行加亮操作(2008-09-03) —
关键词: 串口通信
以前串口通信程序的升级版本,敬请大家试用。
描述:串口通信升级版
附件: SComm_Test 串口通信测试程序.part1.rar (977 K) 下载次数:1005
描述:串口通信升级版
附件: SComm_Test 串口通信测试程序.part2.rar (827 K) 下载次数:907
离线prcseraph

只看该作者 1楼 发表于: 2008-09-04
LJ楼主,
共享万岁
无源码,你在这干嘛
离线feiying888

只看该作者 2楼 发表于: 2008-09-24
没有源代码拿出来干嘛?纯粹就是给自己做广告!
离线jssx
只看该作者 3楼 发表于: 2008-09-25
强烈要求源码!!!
离线suntech

只看该作者 4楼 发表于: 2008-09-25
没别的意思,就是让大家使用的,或者大家在写类似程序的时候多一个参照
离线aaaxjb

只看该作者 5楼 发表于: 2008-09-25
别在 这里秀 !
去 发给下载站 !
离线sodwell

只看该作者 6楼 发表于: 2008-09-28
你不配使用QT
建议还是使用VC编程吧
离线kumding
只看该作者 7楼 发表于: 2008-10-09
有源码吗
离线musicliving
只看该作者 8楼 发表于: 2008-10-11
nitamade jiushiyisbwori
离线see221
只看该作者 9楼 发表于: 2008-10-26
我正在研究嵌入式LINUX的底层通讯问题,强烈要求楼主发源码上来
谢谢了
see221@163.com
思路决定出路!
离线suntech

只看该作者 10楼 发表于: 2008-10-27
这个程序是用QT312做的界面,用windows API实现的串口通信,在linux下是用不了的,只能在windows下运行。linux下的底层通信应该是用c或QT什么的写的,linux我只懂一点。
离线sodwell

只看该作者 11楼 发表于: 2008-10-28
应该是用的商业版  可能还是盗版的  不敢放源代码上来!
离线szpzd
只看该作者 12楼 发表于: 2008-11-22
好东西
离线suntech

只看该作者 13楼 发表于: 2008-11-28
本人是该程序的作者,想出售该程序的源码,200元,有需要的和我联系,
Email:zyingjun@163.com,QQ:478026283。
离线huishouliu
只看该作者 14楼 发表于: 2009-01-16
你娘的有病啊,就一个串口工具?这个他妈的怎么就这么好挣呢,哈哈,没源码就不要发上来,垃圾
MSN/Email :huishouliu@126.com
离线suntech

只看该作者 15楼 发表于: 2009-01-16
楼上的,你他妈有本事给你爹我写一个,你妈的垃圾。
离线ningzb

只看该作者 16楼 发表于: 2009-01-23
//windows下的串口通信的源码
//类的头文件

#pragma once
#include <windows.h>

#include <QThread>
#include <QObject >

class RevThread:
    public QThread
{
    Q_OBJECT
public:
    RevThread(HANDLE hcom);

protected:
    void run();

signals:
    void ReceiveAByte(char dat);
private:
    HANDLE hCom;
};


/////////////////////////////////////////////////////////
class ComRev :
    public QObject
{
    Q_OBJECT

public:
    ComRev();
    ComRev(BYTE port);
    ~ComRev();

    enum BufLen{ REV_BUF_LEN=300};
    enum ErrCode{ PORT_ERR=1,NOT_OPEN=2,OPEN_PORT_FAILED=3,PARA_ERR=4,ERR=5};


    int OpenPort(int port=1);
    int SetComPort(DWORD BaudRate,BYTE ByteSize,BYTE  Parity,BYTE  StopBits);
    void ClosePort();

    bool PortState();
    BYTE GetPortNum();

public slots:
    bool Send(const BYTE *buf,const DWORD len);

signals:
    void ReceiveData(char dat);


private:
    HANDLE hCom;

    RevThread *tRev;

    bool Opened;//打开标志
    char PortNum;//当前所用的端口

};
离线ningzb

只看该作者 17楼 发表于: 2009-01-23
//类的实现文件
#include "ComRev.h"

ComRev::ComRev()
{
    //hCom=0;

    Opened=FALSE;
}
ComRev::ComRev(BYTE port)
{
//    hCom=HANDLE-1;
    Opened=FALSE;

    OpenPort(port);
}

ComRev::~ComRev()
{
    ClosePort();   
}




int ComRev::OpenPort(int port)
{
    LPCWSTR PortStr;
    HANDLE hPort;

    if( (port>9)||(port==0) )
    {
        return -2;
    }

    switch(port)
    {
    case 1:
        PortStr=TEXT("COM1");
        break;
    case 2:
        PortStr=TEXT("COM2");
        break;
    case 3:
        PortStr=TEXT("COM3");
        break;
    case 4:
        PortStr=TEXT("COM4");
        break;
    case 5:
        PortStr=TEXT("COM5");
        break;
    case 6:
        PortStr=TEXT("COM6");
        break;
    case 7:
        PortStr=TEXT("COM7");
        break;
    case 8:
        PortStr=TEXT("COM8");
        break;
    case 9:
        PortStr=TEXT("COM9");
        break;
    default:
        return -2;
    }

    ClosePort();//先关闭以前打开的串口

    hPort=CreateFile( PortStr, GENERIC_READ|GENERIC_WRITE, 0,NULL ,OPEN_EXISTING, 0,NULL);
    if (hPort==(HANDLE)-1)
    {
        return -1;
    }
    else
    {
        hCom=hPort;
        Opened=TRUE;
        PortNum=port;
        tRev=new RevThread(hCom);
        connect(tRev, SIGNAL(ReceiveAByte(char)), this,SIGNAL(ReceiveData(char)) );
        tRev->start();

    }

    return 0;       
}

/*
设置串口参数
参数
Parity:
0无校验
NOPARITY 0 No parity.
ODDPARITY 1 Odd parity.
EVENPARITY 2 Even parity.
MARKPARITY 3 Mark parity.
SPACEPARITY 4 Space parity
*/
int ComRev::SetComPort(DWORD BaudRate,BYTE ByteSize,BYTE  Parity,BYTE  StopBits)
{
    if(Opened!=TRUE)
    {
        return NOT_OPEN;
    }
    if(hCom==(HANDLE)-1)
    {
        return OPEN_PORT_FAILED;
    }

    if( (BaudRate!=110) && (BaudRate!=300) && (BaudRate!=600) && (BaudRate!=1200) &&
        (BaudRate!=2400) && (BaudRate!=4800) && (BaudRate!=9600) && (BaudRate!=14400) &&
        (BaudRate!=19200) && (BaudRate!=38400) && (BaudRate!=57600) && (BaudRate!=115200) &&
        (BaudRate!=128000) && (BaudRate!=256000) )
    {
        return PARA_ERR;
    }

    if(Parity>4)
    {
        return PARA_ERR;
    }
    if( (StopBits!=0)&&(StopBits!=2) )
    {
        return PARA_ERR;
    }


    DCB wdcb;
    GetCommState (hCom,&wdcb);
    wdcb.DCBlength=sizeof(DCB);
    wdcb.BaudRate=BaudRate;
    wdcb.ByteSize=ByteSize;
    wdcb.Parity=Parity;
    wdcb.StopBits=StopBits;
    if(Parity!=0)
    {
        wdcb.fParity=TRUE;
    }
    else
    {
        wdcb.fParity=FALSE;
    }
   
    if(SetCommState (hCom,&wdcb)!=TRUE)
    {
        DWORD i=GetLastError();
        return ERR;
    }
    PurgeComm(hCom,PURGE_TXCLEAR);


    return 0;
}

bool ComRev::Send(const BYTE *buf,DWORD len)
{
    DWORD i;
    DWORD wCount; //写入的字节数
    i=len;
    while(i>0)
    {
        if(WriteFile(hCom,buf,i,&wCount,NULL)!=TRUE)
        {
            return FALSE;
        }
        i-=wCount;
    }
   
    return TRUE;

}


void ComRev::ClosePort()
{
    if(Opened==TRUE)
    {
        tRev->terminate();
        tRev->wait();
        delete tRev;

        CloseHandle(hCom);

    }
    return;
}
bool ComRev::PortState()
{
    return Opened;
}
BYTE ComRev::GetPortNum()
{
    if(Opened==TRUE)
    {
        return PortNum;
    }
    else
    {
        return 0;
    }
   
}



/////////////////////////////////////////////////////////////
RevThread::RevThread(HANDLE h)
{
    hCom=h;
}

void RevThread::run()
{
    while(1)
    {
        char tmpbuf;
        DWORD wCount;
        ReadFile(hCom, &tmpbuf, 1,&wCount, NULL);
        if(wCount==1)
        {
            emit ReceiveAByte(tmpbuf);
        }
        usleep(200);
    }
}
离线ningzb

只看该作者 18楼 发表于: 2009-01-23
刚开始学习,给准备学习Qt 的后来者一个参考
离线khb2000

只看该作者 19楼 发表于: 2009-02-05
?//
离线yingruxue

只看该作者 20楼 发表于: 2009-07-24
兄弟,你也太搞啦。一个串口通信就200,而且还不知道有没有bug呢。

我这里有个计算1+1=2的,按照你的算法,看来能卖2000啦,嘿嘿。
我也提供个串口通信的把,几行而已。

    io_service    isvr_;
    serial_port   port_;
    port_.open("COM3");
    port_.set_option<serial_port_base::baud_rate>(serial_port_base::baud_rate(4800));
    port_.set_option<serial_port_base::character_size>(serial_port_base::character_size(8));
    port_.set_option<serial_port_base::stop_bits>(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
    port_.set_option<serial_port_base::flow_control>(serial_port_base::flow_control(serial_port_base::flow_control::none));
    port_.set_option<serial_port_base::parity>(serial_port_base::parity(serial_port_base::parity::none));
    while(true) {
        char reply[128] = {0};
        size_t reply_size = port_.read_some<boost::asio::mutable_buffers_1>(boost::asio::buffer(reply));
        doAppend(string(reply,reply_size));
        Sleep(100);
    }

用的boost::asio, 是跨各种平台的,比你的强大把。不要写几行代码就牛的不行了,成了井底之蛙。
离线solaris
只看该作者 21楼 发表于: 2009-07-25
恩 赞成!

跨是跨,但感觉好像也缺点什么。
离线firstcong

只看该作者 22楼 发表于: 2009-07-25
引用第20楼yingruxue于2009-07-24 23:44发表的  :
兄弟,你也太搞啦。一个串口通信就200,而且还不知道有没有bug呢。
我这里有个计算1+1=2的,按照你的算法,看来能卖2000啦,嘿嘿。
我也提供个串口通信的把,几行而已。
.......
菜鸟也有翱翔的一天~~~
离线firstcong

只看该作者 23楼 发表于: 2009-07-25
太强了,今天才接触QT和BOOST,感觉很高深,哈哈
菜鸟也有翱翔的一天~~~
离线usbtopc

只看该作者 24楼 发表于: 2009-07-30
引用第18楼ningzb于2009-01-23 10:54发表的  :
刚开始学习,给准备学习Qt 的后来者一个参考


谢谢,学习了。
离线vikizhe
只看该作者 25楼 发表于: 2009-08-09
楼主能拿出来大家使用,已经很不错了,至于给不给源代码,是个人问题,当然如果给出来那是更好,不愿意那么也什么,有些人不应该说三道四,你觉得自己有本事,那你就自己拿出来分享,何必这样说别人呢!!!
离线hekun559

只看该作者 26楼 发表于: 2012-12-16
都有什么功能哈
快速回复
限100 字节
 
上一个 下一个