VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3413|回复: 26

c#中消息的问题,如何接收来自多个消息源对消息进行确定?

[复制链接]

1

主题

15

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-1-5 16:00:01 | 显示全部楼层 |阅读模式
在一个dll中定义了消息发送的函数,
bool StartMonitor(HANDLE hComm, HWND hOwner)
{
        DWORD  dwThreadId;


        CommInfo.hComm = hComm;
        CommInfo.hOwner = hOwner;

        hThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, ThreadProc, &CommInfo, 0, &dwThreadId);
        if (hThread == NULL)
                return false;

        return true;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
        COMMINFO  *pCommInfo;
        DWORD        Bytes = 0;
        DWORD   BytesToRead = 0;
        DWORD        ErrorFlags = 0;
        char        CnfMsg[MAX_BUF_SIZE] = "\0";
        char        szReadBuf[MAX_BUF_SIZE] = "\0";
        DWORD   dwEvtMask = 0;
        DWORD   dwSignal = 0;
       
        pCommInfo = (COMMINFO *)lpParameter;

        //清除串口缓冲区
        PurgeComm(pCommInfo->hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
       
        //哪些串口事件需要监视
        SetCommMask(pCommInfo->hComm, EV_ERR | EV_RLSD | EV_RING | EV_RXCHAR | EV_TXEMPTY);
   
    while (1) {
                WaitCommEvent(pCommInfo->hComm, &dwEvtMask, &Overlapped);
            dwSignal = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);

            if (dwSignal == WAIT_OBJECT_0) {
                if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {
                                Sleep(100);
                                RecvChar(pCommInfo->hComm);
                                if (strlen(RecvBuf) != 0) {

                                        strupr(RecvBuf);

#ifdef    SMS_DLL_DEBUG                                       
                                        sprintf(RecvDebugInfo, "<-- %s", RecvBuf);
                                        if (strncmp(RecvBuf, "ATWITS", 6))
                                                PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
                                        else
                                                if (DispFlag)
                                                        PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
#endif

                                        if (!strncmp(RecvBuf, "ATWITS+CMTI:1", 13)) {
                                                if (pCommInfo->hOwner != NULL)
                                                        PostMessage(pCommInfo->hOwner, WM_RECVSMS, (LPARAM)pCommInfo->hComm, 0);
                                        }
//                                        else if (!strncmp(RecvBuf, "ATWITS", 6)) {
//                                                if (pCommInfo->hOwner != NULL)
//                                                        PostMessage(pCommInfo->hOwner, WM_POWERON, 0, 0);
//                                        }
                                        else if (strlen(RecvBuf) != 0) {
                                                //增加临界区控制
                                                memset(RetInfo, 0, MAX_BUF_SIZE);
                                                strcpy(RetInfo, RecvBuf);
                                                SetEvent(hRecvEvent);
                                        }
                                       
                                        memset(RecvBuf, 0, MAX_BUF_SIZE);
                                }
                        }

                        ResetEvent(Overlapped.hEvent);
                }
                else if(dwSignal == WAIT_OBJECT_0 + 1) {
                        SendChar(pCommInfo->hComm);
                }
        }

        return 0;
}

在c#程序中调用StartMonitor,就可开启对com口的监视,但是程序中需要对一台电脑上的多个串口设备进行监视,因此在c#中重载了winproc函数,RecvSMS((IntPtr)m.WParam, phoneNum, msg);对上面消息进行接收,不能够很好的接收不知大家有没好办法
回复

使用道具 举报

1

主题

15

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-5 19:48:01 | 显示全部楼层
希望大家给点建设性意见
回复

使用道具 举报

1

主题

15

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-7 13:12:01 | 显示全部楼层
没人来帮忙吗
回复

使用道具 举报

0

主题

119

帖子

67.00

积分

新手上路

Rank: 1

积分
67.00
发表于 2020-1-7 15:54:01 | 显示全部楼层
帮顶了,通信不了解!
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-1-7 21:09:01 | 显示全部楼层
来看看..

学习+顶..
回复

使用道具 举报

0

主题

13

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-1-11 00:00:01 | 显示全部楼层
学习中
回复

使用道具 举报

0

主题

23

帖子

20.00

积分

新手上路

Rank: 1

积分
20.00
发表于 2020-1-13 20:00:01 | 显示全部楼层
不能够很好的接收?是怎么个不好法,请详细描述下
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-18 21:09:01 | 显示全部楼层
不懂
回复

使用道具 举报

0

主题

15

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-19 18:54:01 | 显示全部楼层
没太看懂你的代码,我的程序中也是需要对多个串口进行监控,我是写了个类,用于对串口的发送和接收数据,然后在主窗体中实例化这个类,可实例化多个类,类中用timer接受串口数据,然后发送给主窗体,由主窗体判断并发送给各个子窗体.
回复

使用道具 举报

1

主题

15

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-20 13:27:01 | 显示全部楼层
在c#中我用循环打开每个串口,等到所有的设备都被打开后,主程序只能接收到最后一个串口发送来的消息,前面的几个串口等于都不工作了。所以想请大家帮忙啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表