• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : WINCE 串口与GSM通信 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 40826
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2011-03-22
最后登录: 2017-09-13
楼主  发表于: 2011-04-10 13:00

 WINCE 串口与GSM通信

我向串口发送AT指令,用电脑上的串口调试助手能发送正常,但向GSM发送,GSM没点反应,大家帮我看看哪里出错了
发送打电话指令
    char buf[]={"ATD13794443839;\r"};
    SendDataToGPRS(buf,16);

WINCE读数据
DWORD WINAPI CCServiceSrpDlg::ReadPortThread(LPVOID lpParameter)
{
    CCServiceSrpDlg *pDlg = (CCServiceSrpDlg*)lpParameter;
    DWORD evtMask;
    DWORD dwReadErrors;
    COMSTAT cmState;
    DWORD dwLength;
    DWORD actualReadLen;//实际读取的字节数

    char buf[1024];

    //清除收/发缓冲区
    PurgeComm(pDlg->m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);
    //串口事件:接收到一个字符
    SetCommMask(pDlg->m_hComm, EV_RXCHAR|EV_CTS|EV_DSR);

    while (pDlg->m_hComm != INVALID_HANDLE_VALUE && pDlg->m_hComm)
    {
        if(WaitCommEvent(pDlg->m_hComm, &evtMask,0))
        {
            SetCommMask(pDlg->m_hComm, EV_RXCHAR|EV_CTS|EV_DSR);
            if(evtMask&EV_RXCHAR)
            {
                ClearCommError(pDlg->m_hComm,&dwReadErrors,&cmState);
                dwLength=cmState.cbInQue;
                if(dwLength<=0)
                {
                    continue;
                }
                memset(buf, 0, sizeof(buf));
                ReadFile(pDlg->m_hComm, buf, dwLength, &actualReadLen, NULL);
                if(actualReadLen>0)
                {
                    pDlg->DealData(buf, actualReadLen);

                }
            }
        }
    }
    return 0;
}

WINCE接收并显示数据:(这里显示乱码了)
void CCServiceSrpDlg::DealData(char *RecvBuf, DWORD bufLen)
{
    CString str;
    for (DWORD index=0; index<bufLen; index++)
    {
        str.Format(_T("%c "),RecvBuf[index]);
        m_str += str;
    }
    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(m_str);
}

WINCE串口参数设置

BOOL flag = OpenPort(_T("COM1:"),9600,8,ONESTOPBIT,NOPARITY);//打开串的参数
BOOL CCServiceSrpDlg::OpenPort(CString port,INT baudRate,INT dataBits,
                               INT stopBits,INT parity)
{
    if (m_hComm == NULL)
    {
        m_hComm = CreateFile(port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);
        if (m_hComm == INVALID_HANDLE_VALUE)
        {
            MessageBox(_T("打开串口失败,检查是否已被占用"));
            return FALSE;
        }

        //指定端口监测的事件集
        SetCommMask(m_hComm, EV_RXCHAR);// 串口事件:接收到一个字符    
        //分配设备缓冲区
        SetupComm(m_hComm, 51200, 512);    // 设置接收与发送的缓冲区大小

        DCB dcb;
        GetCommState(m_hComm,&dcb);    //获取当前设置的信息
        dcb.BaudRate = baudRate;    //波特率
        dcb.ByteSize = dataBits;    //数据大小
        dcb.Parity   = parity;        //校检位
        dcb.StopBits = stopBits;    //停止位
        dcb.fParity  = FALSE;
        dcb.fBinary  = TRUE;
        dcb.fDtrControl = 0;
        dcb.fRtsControl = 0;
        dcb.fOutX = dcb.fInX = dcb.fTXContinueOnXoff = 0;

        if (!SetCommState(m_hComm,&dcb))
        {
            MessageBox(_T("无法按当前的参数配置端口,请检查参数!"));
            PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
            ClosePort();
            return FALSE;
        }


        //设置起时参数
        COMMTIMEOUTS CommTimeOuts;
        GetCommTimeouts(m_hComm,&CommTimeOuts);
        CommTimeOuts.ReadIntervalTimeout         = 100;
        CommTimeOuts.ReadTotalTimeoutMultiplier  = 1;
        CommTimeOuts.ReadTotalTimeoutConstant     = 100;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
        CommTimeOuts.WriteTotalTimeoutConstant   = 0;
        if (!SetCommTimeouts(m_hComm,&CommTimeOuts))
        {
            MessageBox(_T("无法设置超时参数!"));
            PurgeComm(m_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR);
            ClosePort();
            return FALSE;
        }

        //清除收/发缓冲区
        PurgeComm(m_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR);
        //SetDlgItemText(IDC_BTN_OPEN,_T("关闭串口"));
        return TRUE;
    }
    else
    {
        CloseHandle(m_hComm);
        m_hComm = NULL;
        //SetDlgItemText(IDC_BTN_OPEN,_T("打开串口"));
        return FALSE;
    }
}
级别: 新手上路
UID: 40826
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2011-03-22
最后登录: 2017-09-13
1楼  发表于: 2011-04-16 09:04
没人回,自己回自己吧。

问题已经解决。
通信中发现乱码主要是RS232电平兼容,我解决的办法是直接去掉RS232,也就是说ARM和GSM之间不通过RS232,这样通信就没问题了。

写出来给大家分享一下吧,下次遇到这种问题,大家就不会找那么多弯路了。
级别: 新手上路
UID: 45508
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2011-05-05
最后登录: 2011-05-08
2楼  发表于: 2011-05-07 11:40
楼主还在吗? 我想问一下,在wince下咋实现GSM通信了? 要把程序烧到内核? 可以给我发一下烧程序的过程吗? 谢谢    我的QQ 544926815  
级别: 新手上路
UID: 31845
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2010-11-06
最后登录: 2011-05-22
3楼  发表于: 2011-05-08 00:20

 回 2楼(enhe123) 的帖子

我写的是应用程序,直接操作串口的,把.EXE文件拷到ARM内就行了
级别: 新手上路
UID: 45572
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-05-06
最后登录: 2017-09-13
4楼  发表于: 2011-05-08 09:38

 回 3楼(523hui) 的帖子

恩  这个会了 ~~可现在程序考进去运行时说GPRS初始化失败~~~我都连好了~而且每个口都试过了!还是这个问题~
级别: 新手上路
UID: 31845
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2010-11-06
最后登录: 2011-05-22
5楼  发表于: 2011-05-08 12:00

 回 4楼(xxxooo) 的帖子

和GPRS连接是不用经过RS232的
级别: 新手上路
UID: 45572
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-05-06
最后登录: 2017-09-13
6楼  发表于: 2011-05-08 14:58
那怎么连? 不通过串口的话通过什么啊?~~
级别: 新手上路
UID: 45572
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-05-06
最后登录: 2017-09-13
7楼  发表于: 2011-05-08 15:00

 回 5楼(523hui) 的帖子

有QQ号吗? 我加你QQ吧,正好能多向你学点东西~~~呵呵
级别: 新手上路
UID: 52884
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-07-27
最后登录: 2011-07-27
8楼  发表于: 2011-07-27 15:12
楼主你的串口调试程序源码能给一份么?
不胜感激
QQ:155220997
级别: 新手上路
UID: 33659
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-12-04
最后登录: 2012-06-29
9楼  发表于: 2011-09-19 15:01
请问楼主,ARM与GSM不通过RS232连,那通过什么连接进行通信,ARM板上的com0与GSM连上后,在wince的串口调试工具里没有com0和com1啊?
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go