2386|0

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急!请各位大侠帮忙啊,串口通讯问题 [复制链接]

大家好!
我想通过VC实现一个串口转发的功能,就是说如果串口1有数据过来就转发到串口2上去,串口2有数据过来就发送到串口1上去,我是通过win api 来做的,开了2个线程用于监视串口1和串口2的事件,用WaitCommEvent来等待事件发生,我没有用overlapped 格式,(用了也不好用),我的问题是当有数据到达串口,然后往另一个串口写时,无法完成写操作,程序停在writefile函数那里不动了,具体代码如下:
//这段是开启2个线程的代码
void CSmsTestApp::OnActive()
{
        // TODO: Add extra initialization here
   
    CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
    char* ans = app->ans;

        if(flag != 3)
        {
                AfxMessageBox("请先设置端口!");
                return;
        }
       
    //启动串口1处理线程
        DWORD nThreadId1;
        hCommThread1 = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
                (LPTHREAD_START_ROUTINE)Com1ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &nThreadId1);
        if (hCommThread1 == NULL)
        {
                AfxMessageBox("创建串口1处理线程失败");
                return;
        }

        //启动串口2处理线程
        DWORD nThreadId2;
        hCommThread2 = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
                (LPTHREAD_START_ROUTINE)Com2ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &nThreadId2);
        if (hCommThread2 == NULL)
        {
                AfxMessageBox("创建串口2处理线程失败");
                return;
        }       
}

//这段是2个线程的代码
DWORD WINAPI Com1ThreadProcess(HWND hWnd)//主窗口句柄
{
        DWORD wEven;
        char ans[128];                // 应答串
       
    memset(ans, 0 ,128);
        SetCommMask(hComm1, EV_RXCHAR | EV_TXEMPTY);
        while (TRUE)
        {
                WaitCommEvent(hComm1, &wEven, NULL);
                if(wEven == 0)
                {
                        NULL;
                }
                else
                {
                        if (wEven & EV_RXCHAR == EV_RXCHAR)
                        {
                ReadComm(ans, 128, hComm1);
                if(strlen(ans) > 0)
                                {
                                        //WriteComm(ans, strlen(ans), hComm2);
                    ::PostMessage(hWnd, COM_RECVDATA, (unsigned int) 2, 0);
                                }
               
                                break;
                        }
                }
        }
        return TRUE;
}

DWORD WINAPI Com2ThreadProcess(HWND hWnd)//主窗口句柄
{
        DWORD wEven;
    CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
    char* ans = app->ans;

    memset(ans, 0 ,128);
        SetCommMask(hComm2, EV_RXCHAR | EV_TXEMPTY);
        while (TRUE)
        {
                WaitCommEvent(hComm2, &wEven, NULL);
                if (wEven == 0)
                {
                        NULL;
                }
                else
                {
                        if (wEven & EV_RXCHAR == EV_RXCHAR)
                        {
                                ReadComm(ans, 128, hComm2);
                if(strlen(ans) > 0)
                                {
                                        //WriteComm(ans, strlen(ans), hComm1);
                                        ::PostMessage(hWnd, COM_RECVDATA, (unsigned int) 1, 0);
                                }
               
                                break;
                        }
                }
        }
        return TRUE;
}


//下面是读写串口的接口函数
BOOL OpenComm(const char* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits, HANDLE *handle)
{
        DCB dcb;                // 串口控制块
        COMMTIMEOUTS timeouts = {        // 串口超时控制参数
                100,                                // 读字符间隔超时时间: 100 ms
                1,                                        // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
                500,                                // 基本的(额外的)读超时时间: 500 ms
                1,                                        // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
                100};                                // 基本的(额外的)写超时时间: 100 ms

        *handle = CreateFile(pPort,        // 串口名称或设备路径
                        GENERIC_READ | GENERIC_WRITE,        // 读写方式
                        0,                                // 共享方式:独占
                        NULL,                        // 默认的安全描述符
                        OPEN_EXISTING,        // 创建方式
                        0,                                // 不需设置文件属性
                        NULL);                        // 不需参照模板文件
       
        if(*handle == INVALID_HANDLE_VALUE) return FALSE;                // 打开串口失败

        GetCommState(*handle, &dcb);                // 取DCB

        dcb.BaudRate = nBaudRate;
        dcb.ByteSize = nByteSize;
        dcb.Parity = nParity;
        dcb.StopBits = nStopBits;

        SetCommState(*handle, &dcb);                // 设置DCB

        SetupComm(*handle, 4096, 1024);        // 设置输入输出缓冲区大小

        SetCommTimeouts(*handle, &timeouts);        // 设置超时

        return TRUE;
}

// 关闭串口
BOOL CloseComm(HANDLE hComm)
{
        return CloseHandle(hComm);
}

// 写串口
// 输入: pData - 待写的数据缓冲区指针
//       nLength - 待写的数据长度
// 返回: 实际写入的数据长度
int WriteComm(void* pData, int nLength, HANDLE hComm)
{
        DWORD dwNumWrite;        // 串口发出的数据长度

        WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);

        return (int)dwNumWrite;
}

// 读串口
// 输入: pData - 待读的数据缓冲区指针
//       nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int ReadComm(void* pData, int nLength, HANDLE hComm)
{
        DWORD dwNumRead;        // 串口收到的数据长度

        ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
       
        return (int)dwNumRead;
}


//下面是子线程往主线程发送COM_RECVDATA消息后的处理函数
LRESULT CMainFrame::OnRcvData(WPARAM wPara, LPARAM lPara)
{
    CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
    char* ans = app->ans;
    if(wPara == 1)
    WriteComm(ans, strlen(ans), hComm1);
    else if(wPara == 2)
    WriteComm(ans, strlen(ans), hComm2);

    return 0;
}

以上就是我的大部分程序,各位大侠,请问我要做串口转发究竟该怎么做?
我的程序有什么问题啊,是不是同一线程只能处理一种操作?(读或写)
谢谢大家了
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表