串口通讯:为什么可以读不能写?急!!

gpschen 2003-08-20 04:18:22
我用CreateFile(),ReadFile(),WriteFile()方式进行串口通讯。具体方法与EVC自带的Serial Communication Sample Applicatio基本相同(包括参数设置)。
现在的问题是:可以读取串口的数据,但是发送数据不成功,虽然WriteFile()的返回值是1。
奇怪的是,相同的代码在VC6.0下 发送命令成功。
什么原因?谢谢解答!很急!!

发送命令的源代码如下:
void ~~::OnSend()
{
BOOL bRet = 0;
BYTE Poller[] = {0xA0,0xA2,0x00,0x03,0x93,0x00,0x00,0x00,0x93,0xB0,0xB3};
bRet = SendCommand(Poller,11);
}

BOOL C~::SendCommand(void* pCommand,DWORD dwBufLen)
{
DWORD dwWrited = 0;
BOOL bRet = WriteFile(hPort,pCommand,dwBufLen,&dwWrited,NULL);
return bRet;
}
...全文
504 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonelyprince 2003-11-06
  • 打赏
  • 举报
回复
我写的初始化串口函数,
读写串口没有问题。
lonelyprince 2003-11-06
  • 打赏
  • 举报
回复
BOOL CGpsNavView::InitComm()
{
m_hComm = CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(m_hComm == INVALID_HANDLE_VALUE)
{
MessageBox(L"Open COM Failed! Port used");
m_hComm = NULL;
return FALSE;
}
::SetupComm(m_hComm, 4096, 4096);
DCB ComDCB;
ComDCB.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &ComDCB);
ComDCB.BaudRate = 9600;
ComDCB.ByteSize = 8;
ComDCB.Parity = 0;
ComDCB.StopBits = ONESTOPBIT;
SetCommState(m_hComm, &ComDCB);

COMMTIMEOUTS ot;
memset(&ot, 0, sizeof(ot));
ot.ReadIntervalTimeout = MAXDWORD;
SetCommTimeouts(m_hComm, &ot);

m_bExitComm1Thread = FALSE;
m_pCom1Thread = AfxBeginThread(lpCompassRecvProc, this, THREAD_PRIORITY_ABOVE_NORMAL);
if(m_pCom1Thread)
m_pCom1Thread->m_bAutoDelete = TRUE;
else
{
MessageBox(L"Open Comm Thread Failed!");
return FALSE;
}
BYTE buf[2];
DWORD len;
buf[0]=0xa3;
buf[1]='\0';
WriteFile(m_hComm,buf,1,&len,NULL);
buf[0]=0x02;
buf[1]='\0';
WriteFile(m_hComm,buf,1,&len,NULL);
return TRUE;
}
yaj95 2003-11-04
  • 打赏
  • 举报
回复
我也遇到同样的问题了,同样的代码在VC6.0能通过,而且读写字符正常。但是EVC4.0中,在两台PC串口1相连时,一台不停的写,另一台不停的读,WriteFile返回1,但是不能读出来,也不知道WriteFile是否写正确了。
misshome 2003-08-23
  • 打赏
  • 举报
回复
看看pb自带的tty的例子,上面有很多具体的例子.
yellowsun 2003-08-22
  • 打赏
  • 举报
回复
当时我用 FILE_FLAG_OVERLAPPED 参数时,可以打开串口,但不能读也不能写,后来改过就好了 hCom = CreateFile(COMPorts, GENERIC_READ Or GENERIC_WRITE, 0, lpSecurity, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL) ‘打开串口
按下面的读写都可以
fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite, dwBytesWritten, lpOVERLAPPED) ‘写的调用
fReadStat = ReadFile(hCom, lpBuffer, dwLength, dwBytesRead, lpOVERLAPPED)
’读的调用
在同一个串口同时收发,建立两个线程。一个读的线程,一个写就可以实现,我是这么做的!
yellowsun 2003-08-22
  • 打赏
  • 举报
回复
那位大虾用过vb.net做WINCE.NET下程序,给点意见啊。wince.net支持的API怎么调用啊
小第做好的程序在windows可以正确运行,但在wince.net下就提示API不被支持,具体就是
调用createfile()就出现System.NotSupportedException的错误。
yellowsun 2003-08-21
  • 打赏
  • 举报
回复
我用VB.NET调用串口API写的串口通讯程序在windows平台上可以正确收发了。在转移的
wince.net上那些createfie()等API根本不支持,是什么原因啊。急啊,程序都写好了,不
会在用EVC写一便把??
hansin 2003-08-21
  • 打赏
  • 举报
回复
奇怪问题,关注...
sunshinefl 2003-08-21
  • 打赏
  • 举报
回复
帮你up
gpschen 2003-08-21
  • 打赏
  • 举报
回复
我的程序与EVC自带的Serial Communication Sample Applicatio tty基本相同。
创建了一个读的线程。

gpschen 2003-08-21
  • 打赏
  • 举报
回复
急啊,急!!!
sunshinefl 2003-08-21
  • 打赏
  • 举报
回复
这是我的读写代码 请大侠指教 :)

::ReadComm(char *buf, DWORD dwLength)
{
DWORD length=0;
COMSTAT ComStat;

DWORD dwErrorFlags;


ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength, ComStat.cbInQue);
ReadFile(m_hCom,buf,length,&length,NULL);

return length;
::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT comstat;
DWORD dwErrorFlags;

ClearCommError(m_hCom, &dwErrorFlags, &comstat);

fState=WriteFile(m_hCom, buf, length, &length, NULL);
//if(fState) m_str="true";
//else m_str="false";

return length;
}
blue2moon 2003-08-21
  • 打赏
  • 举报
回复
我也遇到了这个问题,写时不报错,但我怀疑数据写的正确性!
很可能你读的数据根本就不对,把你的读代码贴出来看看。
sunshinefl 2003-08-21
  • 打赏
  • 举报
回复
搂住的问题我也遇到了 读到的数据正确
gpschen 2003-08-21
  • 打赏
  • 举报
回复
读的时候绝对没错。因为输出是二进制的,格式已知,数据都解码出来了。

输入的数据也应该没错,因为在VC6.0下,相同的代码,可以输入相同的命令数据,并且设备还有Acknowledgement输出,说明命令输入成功。

在EVC下,不支持异步通讯方式,即CreatFile()里一个参数不能为FILE_FLAG_OVERLAPPED,所以很多现有的串口通讯类不能使用。但是好像有人说可以创建两个线程来做,一个输出,一个输入,不知道具体怎么实现?

例外,有人说Comm控件在EVC下不能正常使用,是这样吗? 有谁试过?
曾经的董胖 2003-08-21
  • 打赏
  • 举报
回复
你确信你读回的数据正确吗?

19,500

社区成员

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

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