嵌入式爱好者

查看: 12430|回复: 10

[Win CE] Wince 一个进程中的多线程问题

[复制链接]
liuguangyu 该用户已被删除
发表于 2013-10-15 22:35:02 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352\i.MX9131通行证

发表于 2013-10-16 08:43:06 | 显示全部楼层
楼主不一定非得要创建四个线程吧!四个串口同时接受数据,我这有代码可以让您参考!!!
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

liuguangyu 该用户已被删除
 楼主| 发表于 2013-10-16 08:59:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352\i.MX9131通行证

发表于 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[0]))
// 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[20];
        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[i-2]=InitCommunication(i);
        }


}
HANDLE Cmy_test_comDlg::InitCommunication(int comid)
{


        int btl=115200;
        int jy=NOPARITY;


        BSEND=FALSE;
        DCB dcb;
        //TCHAR szDbg[128];
        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[20]; 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[100];
        char szAnsi[100];
        char szAnsi0[100];
        WCHAR szAnsi1[100];
        size_t siz;
        COMSTAT Stat;
        DWORD dwErr = 0;
       
        int recvnum;
        int u;
        for(u=0;u<m_stredit1.GetLength();u++)
        szAnsi1[u]=m_stredit1.GetAt(u);
    wcstombs_s(&siz, szAnsi0, u+1, szAnsi1, _TRUNCATE);
        if(count==0)
        {
                ClearCommError (hhComPort[count], &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        m_strRecv1=_T("\r\nNO DATA");
            tongguo1=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }
                ReadFile (hhComPort[count], &szAnsi, recvnum, &cBytes, 0);
                //m_recv1+=cBytes;
                for(i=0;i<cBytes;i++)
                {
                    if(szAnsi[i]!=szAnsi0[i])
                        {
                                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[i];
                }
                //m_strRecv+=szText;
                m_strRecv1+=_T("\r\n");
                UpdateData(FALSE);
        }
        if(count==1)
        {
                ClearCommError (hhComPort[count], &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        ;
                        m_strRecv2=_T("\r\nNO DATA");
                        tongguo2=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }
                ReadFile (hhComPort[count], &szAnsi, recvnum, &cBytes, 0);
                                for(i=0;i<cBytes;i++)
                {
                    if(szAnsi[i]!=szAnsi0[i])
                        {
                                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[i];
                }
                //m_strRecv+=szText;
                m_strRecv2+=_T("\r\n");
                UpdateData(FALSE);
       
        }
        if(count==2)
        {
                ClearCommError (hhComPort[count], &dwErr, &Stat);
                if(Stat.cbInQue)recvnum=Stat.cbInQue;
                else
                {
                        ;
                        m_strRecv3=_T("\r\nNO DATA");
                        tongguo3=_T("未通过");
                        UpdateData(FALSE);
                        return;
                }

                ReadFile (hhComPort[count], &szAnsi, recvnum, &cBytes, 0);
       
                for(i=0;i<cBytes;i++)
                {
                    if(szAnsi[i]!=szAnsi0[i])
                        {
                                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[i];                               
                }
                //m_strRecv+=szText;
                m_strRecv3+=_T("\r\n");
                UpdateData(FALSE);
       
        }
         //TRACE(_T("\r\nrecv=%s"),szText);
}

void Cmy_test_comDlg::senddata(int count)
{
        // TODO: 在此添加控件通知处理程序代码
        //HWND  hwndSText;
        int rc;
        DWORD cBytes;
        //WCHAR szText[100];
        char szAnsi[100];
        WCHAR szAnsi1[100];
        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[u]=m_stredit1.GetAt(u);
                                 wcstombs_s(&siz, szAnsi, u+1, szAnsi1, _TRUNCATE);
        if(count==0)
        {
                        rc = WriteFile(hhComPort[count],&szAnsi,strlen(szAnsi),&cBytes,&olWrite);
        }

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


        if(count==2)
        {
                        rc = WriteFile(hhComPort[count],&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[count], &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[i]!=INVALID_HANDLE_VALUE)
                {
                        CloseHandle(hhComPort[i]);
                        hhComPort[i]=INVALID_HANDLE_VALUE;

                }
        }
        OnOK();
}

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

    for(int i=0;i<3;i++)
        {
                if(hhComPort[i]!=INVALID_HANDLE_VALUE)
                {
                        CloseHandle(hhComPort[i]);
                        hhComPort[i]=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 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352\i.MX9131通行证

发表于 2013-10-18 11:20:00 | 显示全部楼层
这就是一个普通的串口测试程序,是用vs2005做的,楼主看不懂?
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

liuguangyu 该用户已被删除
 楼主| 发表于 2013-10-19 16:41:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352\i.MX9131通行证

发表于 2013-10-21 08:32:46 | 显示全部楼层
这是我们内部测试用的程序,是不对外发布的,所以我才只把串口的给你发了的!楼主!
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

weichaocz 该用户已被删除
发表于 2013-12-20 08:34:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352\i.MX9131通行证

发表于 2013-12-30 08:51:39 | 显示全部楼层
谢谢楼上的理解了!!!
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

suifengzhulang 该用户已被删除
发表于 2014-2-17 17:27:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-4-19 22:53

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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