win ce 4.2串口开发的问题?

duan001 2006-11-08 10:08:04
代码如下:

hSerial = CreateFile(L"COM1:",
               GENERIC_READ | GENERIC_WRITE,
               0,
               NULL,
               OPEN_EXISTING,
               0,
               NULL);

if(m_hSerial == NULL)
{
///L"串口打开失败";
return;
}

  //指定端口监测的事件集
  SetCommMask (hSerial , EV_RXCHAR);

  //分配设备缓冲区 
  SetupComm(hSerial ,512,512);

 //初始化缓冲区中的信息
 PurgeComm(hSerial ,PURGE_TXCLEAR|PURGE_RXCLEAR);

///配置串口
DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
// 默认串口参数

  //得到端口的默认设置信息
  GetCommState (hPort, &PortDCB);
  //改变DCB结构设置
  PortDCB.BaudRate = 19200; //波特率
  PortDCB.fBinary = TRUE; //Win32不支持非二进制串行传输模式,必须为TRUE
  PortDCB.fParity = TRUE; //启用奇偶校验
  PortDCB.fOutxCtsFlow = TRUE; //串行端口的输出由CTS线控制
  PortDCB.fOutxDsrFlow = FALSE; //关闭串行端口的DSR流控制
  PortDCB.fDtrControl = DTR_CONTROL_ENABLE; //启用DTR线
  PortDCB.fDsrSensitivity = FALSE; //如果设为TRUE将忽略任何输入的字节,除非DSR线被启用
  //PortDCB.fTXContinueOnXoff = TRUE; //当为TRUE时,如果接收缓冲区已满且驱动程序已传送XOFF字符,将使驱动程序停止传输字符

  PortDCB.fTXContinueOnXoff = FALSE;
  PortDCB.fOutX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输出
  PortDCB.fInX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输入
  PortDCB.fErrorChar = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段
  PortDCB.fNull = FALSE; //设为TRUE将使串行驱动程序忽略收到的空字节
  PortDCB.fRtsControl = RTS_CONTROL_ENABLE; //启用RTS线
  PortDCB.fAbortOnError = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段
  PortDCB.ByteSize = 8; //每字节的位数
  PortDCB.Parity = NOPARITY; //无奇偶校验
  PortDCB.StopBits = ONESTOPBIT; //每字节一位停止位


  if (!SetCommState (hPort, &PortDCB))
  {
   //不能配置串行端口
   MessageBox (NULL, TEXT("Unable to configure the serial port"),TEXT("Error"), MB_OK);
   dwError = GetLastError ();
   return FALSE;
  }
  return TRUE;


每次执行到这里就不行了, dwError返回值为6,6的意思好象是无效的句柄,
不能配置串行端口。请各位高手指教!
...全文
681 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyz666 2007-01-15
  • 打赏
  • 举报
回复
可能驱动有问题,我也在串口通讯都没问题。
najzni 2007-01-15
  • 打赏
  • 举报
回复
我也碰到类似的问题,问题出在SetCommState 函数这儿,PortDCB结构只需要设置 数据位、停止位、奇偶校验位、波特率四个参数就可以了。
红牛哥110 2007-01-03
  • 打赏
  • 举报
回复
if(m_hSerial == NVALID_HANDLE_VALUE)
红牛哥110 2007-01-03
  • 打赏
  • 举报
回复
m_hSerial = CreateFile(L"COM1:",
               GENERIC_READ | GENERIC_WRITE,
               0,
               NULL,
               OPEN_EXISTING,
               0,
               NULL);

if(m_hSerial == NULL)
{
///L"串口打开失败";
return;
}
//還不對,就是Com1被其它程度占用了,或驅動有問題.
//感覺代碼很亂,一下hSerial,一下又m_hSerial .
e32hmi 2006-12-31
  • 打赏
  • 举报
回复
各位高手,请问,我希望在我的win ce样机中增加类似于terminal那样的串口信息显示软件,可能吗?如何做?谢谢。
wushirenfei3 2006-12-31
  • 打赏
  • 举报
回复
给你一个VC串口这部分源代码参考一下,希望对你有帮助

BOOL CPSerialPort::OpenPort(LPCTSTR Port,int BaudRate,int DataBits,int StopBits,int Parity,LPDataArriveProc proc,DWORD userdata)
{
m_lpDataArriveProc=proc;
m_dwUserData=userdata;

if(m_hComm==INVALID_HANDLE_VALUE)
{
m_hComm=CreateFile(Port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComm==INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
return FALSE;
}
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;

//设置状态参数
SetCommMask(m_hComm,EV_RXCHAR | EV_ERR);
SetupComm(m_hComm,16384,16384);
if(!SetCommState(m_hComm,&dcb))
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}

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

PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
return TRUE;
}

return FALSE;
}
YourKing 2006-12-28
  • 打赏
  • 举报
回复
如果CreateFile得到了正确的handle那么下面用这个handle就不会NVALID_HANDLE_VALUE,除非你给它又付值为NVALID_HANDLE_VALUE
看你上面的代码,你可能是在一个地方CreateFile,然后有在另一个地方调用那个handle的,建议统一只用一个。你一会儿hSerial ,一会儿hPort,一会儿m_hSerial,其中一个有改动就会影响另外的几个。
建议你CreateFile后开始单步调试,一步一步走,成功了再走下一步,如先GetCommState 成功了再SetCommState ,很快就可以找到问题关键的
sankt 2006-12-28
  • 打赏
  • 举报
回复
换个com口试试看
duan001 2006-11-28
  • 打赏
  • 举报
回复
再改为:
hSerial = CreateFile(L"COM1:", ....

还是提示为:
m_hSerial == NVALID_HANDLE_VALUE

请高手指教!
可不可能是串口驱动的问题?
硬件的问题可以排除, 因为烧录的时候用超级终端都没有问题。
我用的是win ce 4.2, S3C2410的开发板。
duan001 2006-11-25
  • 打赏
  • 举报
回复
thanks,

hSerial = CreateFile(L"COM1:", ....
已改成hSerial = CreateFile(L"COM1", ....


if(m_hSerial == NULL)是笔误,
已改成if(m_hSerial == NVALID_HANDLE_VALUE)


现在提示为:
m_hSerial == NVALID_HANDLE_VALUE


hansin 2006-11-24
  • 打赏
  • 举报
回复
COM1: 冒号可以去掉试一下
singlerace 2006-11-24
  • 打赏
  • 举报
回复
典型的错误,CreateFile失败时返回INVALID_HANDLE_VALUE,不是NULL。你这段代码可能CreateFile就失败了。
hSerial = CreateFile(L"COM1:",
               GENERIC_READ | GENERIC_WRITE,
               0,
               NULL,
               OPEN_EXISTING,
               0,
               NULL);

if(m_hSerial == NULL)
{
}
crazyeagle 2006-11-24
  • 打赏
  • 举报
回复
hSerial:串口句柄
m_hSerial:??
hPort:??
lyl_98 2006-11-24
  • 打赏
  • 举报
回复
句柄都不对啊,
这代码,是从别的的方拷得把
lenux 2006-11-24
  • 打赏
  • 举报
回复
串口句柄要统一啊,下面用的句柄和打开的串口根本不一致。

CreateFile后返回的是hSerial,下面却用到了if(m_hSerial == NULL)
GetCommState (hPort, &PortDCB);
if (!SetCommState (hPort, &PortDCB))

都改成hSerial应该就可以了
meric 2006-11-23
  • 打赏
  • 举报
回复
DCB用设那么多吗,设个波特率、奇偶校验……几项试试
测试程序?类似串口精灵?google一下,ARM的见过,其他的没有试过
duan001 2006-11-22
  • 打赏
  • 举报
回复
GZ
duan001 2006-11-08
  • 打赏
  • 举报
回复
thanks,
不知道是不是用BP添加串口驱动有没问题!
那里有串口的测试程序?

YourKing 2006-11-08
  • 打赏
  • 举报
回复
DCB结构里不用每个都设定吧,只设你用到的就可以了
还有MSDN:
The SetCommState function fails if the XonChar member of the DCB structure is equal to the XoffChar member.
色郎中 2006-11-08
  • 打赏
  • 举报
回复
帮你顶下

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧