liuguangyu 发表于 2013-10-15 22:35:02

飞凌-路飞 发表于 2013-10-16 08:43:06

楼主不一定非得要创建四个线程吧!四个串口同时接受数据,我这有代码可以让您参考!!!

liuguangyu 发表于 2013-10-16 08:59:40

飞凌-路飞 发表于 2013-10-17 08:56:03

// my_test_comDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Test6410.h"
#include "my_test_comDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define dim(x) (sizeof(x)/sizeof(x))
// Cmy_test_comDlg 对话框
int        jishu =0;
int flag=0;

IMPLEMENT_DYNAMIC(Cmy_test_comDlg, CDialog)

Cmy_test_comDlg::Cmy_test_comDlg(CWnd* pParent /*=NULL*/)
        : CDialog(Cmy_test_comDlg::IDD, pParent)
        , m_strRecv1(_T(""))
        , m_strRecv2(_T(""))
        , m_strRecv3(_T(""))
        , m_stredit1(_T("abcdefgh1234567890ABCDEFGH"))
        , m_stredit2(_T("abcdefgh1234567890ABCDEFGH"))
        , m_stredit3(_T("abcdefgh1234567890ABCDEFGH"))
        , tongguo1(_T(""))
        , tongguo2(_T(""))
        , tongguo3(_T(""))
{

}

Cmy_test_comDlg::~Cmy_test_comDlg()
{
}

void Cmy_test_comDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_RECV1, m_strRecv1);
        DDX_Text(pDX, IDC_RECV2, m_strRecv2);
        DDX_Text(pDX, IDC_RECV3, m_strRecv3);
        DDX_Text(pDX, IDC_SEND1, m_stredit1);
        DDX_Text(pDX, IDC_SEND2, m_stredit2);
        DDX_Text(pDX, IDC_SEND3, m_stredit3);
        DDX_Text(pDX, IDC_RECV_COUNT1, tongguo1);
        DDX_Text(pDX, IDC_RECV_COUNT2, tongguo2);
        DDX_Text(pDX, IDC_RECV_COUNT3, tongguo3);
}


BEGIN_MESSAGE_MAP(Cmy_test_comDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
        ON_WM_SIZE()
#endif
        ON_WM_TIMER()

        ON_BN_CLICKED(IDOK, &Cmy_test_comDlg::OnBnClickedOk)
        ON_BN_CLICKED(IDCANCEL, &Cmy_test_comDlg::OnBnClickedCancel)
        ON_EN_CHANGE(IDC_RECV1, &Cmy_test_comDlg::OnEnChangeRecv1)
        ON_EN_CHANGE(IDC_RECV3, &Cmy_test_comDlg::OnEnChangeRecv3)
END_MESSAGE_MAP()


// Cmy_test_comDlg 消息处理程序
BOOL Cmy_test_comDlg::OnInitDialog()
{
        CDialog::OnInitDialog();
        hComPort=INVALID_HANDLE_VALUE;//-1
        TCHAR STRCOM;
        for(int i=1;i<10;i++)
        {
                _stprintf_s(STRCOM,10,_T("COM%d"),i);

        }

        // TODO: 在此添加额外的初始化代码
        //InitCommunication();
    InitCom();
        SetTimer(100,1000,NULL);
       

        return TRUE;// 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void Cmy_test_comDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
        if (AfxIsDRAEnabled())
        {
                DRA::RelayoutDialog(
                        AfxGetResourceHandle(),
                        this->m_hWnd,
                        DRA::GetDisplayMode() != DRA::Portrait ?
                        MAKEINTRESOURCE(IDD_MY_TEST_COM_DIALOG_WIDE) :
                        MAKEINTRESOURCE(IDD_MY_TEST_COM_DIALOG));
        }
}
#endif

void Cmy_test_comDlg::InitCom(void)
{
        int i;
        for(i=2;i<5;i++)
        {
           hhComPort=InitCommunication(i);
        }


}
HANDLE Cmy_test_comDlg::InitCommunication(int comid)
{


        int btl=115200;
        int jy=NOPARITY;


        BSEND=FALSE;
        DCB dcb;
        //TCHAR szDbg;
        COMMTIMEOUTS cto;
        OVERLAPPED OverLapWrt;
        HANDLE hLocal=INVALID_HANDLE_VALUE;
//        DWORD dwTStat;
       
        hComPort = INVALID_HANDLE_VALUE;
        memset(&OverLapWrt,0,sizeof(OVERLAPPED));
        if (hComPort != INVALID_HANDLE_VALUE)
        {
                CloseHandle (hComPort);
                hComPort = INVALID_HANDLE_VALUE;
        }
        TCHAR STRCOM; DWORD derrcode=0xff;
        _stprintf_s(STRCOM,10,_T("COM%d:"),comid);


        hLocal = CreateFile(STRCOM, GENERIC_READ | GENERIC_WRITE,
                0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
        derrcode=GetLastError();

        if (hLocal != INVALID_HANDLE_VALUE)
        {
                // 配置串口
                try
                {
                                //PurgeComm( hLocal, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
                        dcb.DCBlength = sizeof (dcb);
                        GetCommState (hLocal, &dcb);
                        dcb.BaudRate = btl;
                        dcb.fParity = FALSE;
                        dcb.fNull = FALSE;
                        dcb.StopBits = ONESTOPBIT;
                        dcb.Parity = jy;
                        dcb.ByteSize = 8;
                       
                        SetCommState (hLocal, &dcb);
                       

                        SetCommMask(hLocal, EV_RXCHAR ) ;
                        SetupComm(hLocal, 4096, 4096 ) ;
                       PurgeComm(hLocal, PURGE_TXABORT | PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR );
                        // 设定超时
                        GetCommTimeouts (hLocal, &cto);
                        cto.ReadIntervalTimeout = 0;
                        cto.ReadTotalTimeoutMultiplier = 0;
                        cto.ReadTotalTimeoutConstant = 0;
                        cto.WriteTotalTimeoutMultiplier = 0;
                        cto.WriteTotalTimeoutConstant = 0;
                        SetCommTimeouts (hLocal, &cto);
                        hComPort=hLocal;
                        m_strRecv1=_T("");
                        //m_stredit=_T("");
                        //m_recv1=0;
                        //m_send1=0;
                        //_stprintf_s(STRCOM,10,_T("COM%d打开成功"),comid);
                        //MessageBox(_T("COM打开成功"));
                        //MessageBox(STRCOM);

                }catch(...)
                {
                       //MessageBox(_T("打开失败"));
                        _stprintf_s(STRCOM,10,_T("COM%d打开失败"),comid);

                        MessageBox(STRCOM);
                       hComPort = INVALID_HANDLE_VALUE;
                }
        }
        else
        {
                //MessageBox(_T("打开失败"));
                                        _stprintf_s(STRCOM,10,_T("COM%d打开失败"),comid);

                        MessageBox(STRCOM);
                hComPort = INVALID_HANDLE_VALUE;
        }
        if(hComPort == INVALID_HANDLE_VALUE)
        {

        }
        return hComPort;
}


/*void Cmy_test_comDlg::OnBnClickedUartClose()
{
        // TODO: 在此添加控件通知处理程序代码
        if (hComPort != INVALID_HANDLE_VALUE)
                CloseHandle (hComPort);
        hComPort = INVALID_HANDLE_VALUE;

}*/





/*void Cmy_test_comDlg::OnBnClickedUartAut()
{
        // TODO: 在此添加控件通知处理程序代码
        UpdateData(TRUE);
}
*/

void Cmy_test_comDlg::ReadFun(int count)
{
        //HWND hWnd;
        DWORD cBytes=0, i;
        WCHAR szText;
        char szAnsi;
        char szAnsi0;
        WCHAR szAnsi1;
        size_t siz;
        COMSTAT Stat;
        DWORD dwErr = 0;
       
        int recvnum;
        int u;
        for(u=0;u<m_stredit1.GetLength();u++)
        szAnsi1=m_stredit1.GetAt(u);
    wcstombs_s(&siz, szAnsi0, u+1, szAnsi1, _TRUNCATE);
        if(count==0)
        {
                ClearCommError (hhComPort, &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        m_strRecv1=_T("\r\nNO DATA");
            tongguo1=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }
                ReadFile (hhComPort, &szAnsi, recvnum, &cBytes, 0);
                //m_recv1+=cBytes;
                for(i=0;i<cBytes;i++)
                {
                  if(szAnsi!=szAnsi0)
                        {
                                flag=1;

                        }
                }
      if(flag==1)
                {
                        tongguo1=_T("未通过");
                }
                else
                {
                        tongguo1=_T("通过");
                }
                mbstowcs_s (&siz, szText, dim(szText), szAnsi, _TRUNCATE);
                if(m_strRecv1.GetLength()>500)
                      
                {
                        m_strRecv1=_T("");
                }
                       
                for(i=0;i<cBytes;i++)
                {
                        //if((m_strRecv1.GetLength()%25==0)&&(m_strRecv1.GetLength()>0))
                                //m_strRecv1+=_T("\r\n");
                        m_strRecv1+=szText;
                }
                //m_strRecv+=szText;
                m_strRecv1+=_T("\r\n");
                UpdateData(FALSE);
        }
        if(count==1)
        {
                ClearCommError (hhComPort, &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        ;
                        m_strRecv2=_T("\r\nNO DATA");
                        tongguo2=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }
                ReadFile (hhComPort, &szAnsi, recvnum, &cBytes, 0);
                                for(i=0;i<cBytes;i++)
                {
                  if(szAnsi!=szAnsi0)
                        {
                                flag=1;

                        }
                }
      if(flag==1)
                {
                        tongguo2=_T("未通过");
                }
                else
                {
                        tongguo2=_T("通过");
                }
                //m_recv2+=cBytes;
                mbstowcs_s (&siz, szText, dim(szText), szAnsi, _TRUNCATE);
                if(m_strRecv2.GetLength()>500)                      
                {
                        m_strRecv2=_T("");

                }
                       
                for(i=0;i<cBytes;i++)
                {
                        //if((m_strRecv2.GetLength()%25==0)&&(m_strRecv2.GetLength()>0))
                                //m_strRecv2+=_T("\r\n");
                        m_strRecv2+=szText;
                }
                //m_strRecv+=szText;
                m_strRecv2+=_T("\r\n");
                UpdateData(FALSE);
       
        }
        if(count==2)
        {
                ClearCommError (hhComPort, &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        ;
                        m_strRecv3=_T("\r\nNO DATA");
                        tongguo3=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }

                ReadFile (hhComPort, &szAnsi, recvnum, &cBytes, 0);
       
                for(i=0;i<cBytes;i++)
                {
                  if(szAnsi!=szAnsi0)
                        {
                                flag=1;

                        }
                }
      if(flag==1)
                {
                        tongguo3=_T("未通过");
                }
                else
                {
                        tongguo3=_T("通过");
                }
                //m_recv3+=cBytes;
                mbstowcs_s (&siz, szText, dim(szText), szAnsi, _TRUNCATE);
                if(m_strRecv3.GetLength()>500)                      
                {
                        m_strRecv3=_T("");
                }
                       
                for(i=0;i<cBytes;i++)
                {
                        //if((m_strRecv3.GetLength()%25==0)&&(m_strRecv3.GetLength()>0))
                                //m_strRecv3+=_T("\r\n");
                        m_strRecv3+=szText;                               
                }
                //m_strRecv+=szText;
                m_strRecv3+=_T("\r\n");
                UpdateData(FALSE);
       
        }
       //TRACE(_T("\r\nrecv=%s"),szText);
}

void Cmy_test_comDlg::senddata(int count)
{
        // TODO: 在此添加控件通知处理程序代码
        //HWNDhwndSText;
        int rc;
        DWORD cBytes;
        //WCHAR szText;
        char szAnsi;
        WCHAR szAnsi1;
        size_t siz;
        COMSTAT Stat;
        DWORD dwErr = 0;
        OVERLAPPED olWrite;
    memset(&olWrite,0,sizeof(olWrite));
    olWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

                                if((m_stredit1.GetLength()<1)&&(m_stredit1.GetLength()>100)) return;

                                int u=0;
                                for(u=0;u<m_stredit1.GetLength();u++)
                                szAnsi1=m_stredit1.GetAt(u);
                               wcstombs_s(&siz, szAnsi, u+1, szAnsi1, _TRUNCATE);
        if(count==0)
        {
                        rc = WriteFile(hhComPort,&szAnsi,strlen(szAnsi),&cBytes,&olWrite);
        }

        if(count==1)
        {
                        rc = WriteFile(hhComPort,&szAnsi,strlen(szAnsi),&cBytes,&olWrite);
        }


        if(count==2)
        {
                        rc = WriteFile(hhComPort,&szAnsi,strlen(szAnsi),&cBytes,&olWrite);
        }
                //if(count==0)       
                  //m_send1+=strlen(szAnsi);
                                //if(count==1)       
               // m_send2+=strlen(szAnsi);               
                                //if(count==2)       
                  //m_send3+=strlen(szAnsi);
        if (!rc)
        {
                               
                                               
                if (ClearCommError (hhComPort, &dwErr, &Stat))
                {
                                        //TRACE(_T("\r\nClearCommError "));l
                                        //MessageBox(NULL,szText,TEXT("message"),0);
                }
        }
        else
        {
                                                       
                        //MessageBox(NULL,szText,TEXT("message"),0);                        }
        }
       
}
void Cmy_test_comDlg::OnTimer(UINT nIDEvent)
{

          int j;
       if(hComPort==INVALID_HANDLE_VALUE) return;
       if(jishu<8)
       {
               for(j=0;j<6;j++)
                        senddata(j);
               Sleep(20);
       }

       if(jishu<8)
       {       
               for(j=0;j<6;j++)
                        ReadFun(j);
               Sleep(20);
       }
       jishu++;

}



void Cmy_test_comDlg::OnBnClickedOk()
{
        // TODO: 在此添加控件通知处理程序代码
        for(int i=0;i<3;i++)
        {
                if(hhComPort!=INVALID_HANDLE_VALUE)
                {
                        CloseHandle(hhComPort);
                        hhComPort=INVALID_HANDLE_VALUE;

                }
        }
        OnOK();
}

void Cmy_test_comDlg::OnBnClickedCancel()
{
        // TODO: 在此添加控件通知处理程序代码

    for(int i=0;i<3;i++)
        {
                if(hhComPort!=INVALID_HANDLE_VALUE)
                {
                        CloseHandle(hhComPort);
                        hhComPort=INVALID_HANDLE_VALUE;

                }
        }
        if(hComPort=INVALID_HANDLE_VALUE)
        {
                        CloseHandle(hComPort);
                        hComPort=INVALID_HANDLE_VALUE;

        }

        OnCancel();
}

void Cmy_test_comDlg::OnEnChangeRecv1()
{
        // TODO:If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialog::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.

        // TODO:Add your control notification handler code here
}

void Cmy_test_comDlg::OnEnChangeRecv3()
{
        // TODO:If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialog::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.

        // TODO:Add your control notification handler code here
}
楼主看看吧 我测试过的 把三个串口的收发短路,可以同时接收数据的!

liuguangyu 发表于 2013-10-18 10:24:25

飞凌-路飞 发表于 2013-10-18 11:20:00

这就是一个普通的串口测试程序,是用vs2005做的,楼主看不懂?

liuguangyu 发表于 2013-10-19 16:41:39

飞凌-路飞 发表于 2013-10-21 08:32:46

这是我们内部测试用的程序,是不对外发布的,所以我才只把串口的给你发了的!楼主!

weichaocz 发表于 2013-12-20 08:34:39

飞凌-路飞 发表于 2013-12-30 08:51:39

谢谢楼上的理解了!!!

suifengzhulang 发表于 2014-2-17 17:27:04

页: [1]
查看完整版本: Wince 一个进程中的多线程问题