kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1483回复:14

急!!串口写不下去啊

楼主#
更多 发布于:2004-12-13 13:35
HANDLE m_hComhandle;

//Open port
m_hComhandle = CreateFile(
        "COM2",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL);

    
    DCB CommSettings;
GetCommState(m_hComhandle,&CommSettings);

CommSettings.DCBlength = sizeof(CommSettings);
    CommSettings.BaudRate  = 9600;
    CommSettings.ByteSize  = 8;
    CommSettings.Parity    = 0;
    CommSettings.StopBits  = 1;
// CommSettings.fDsrSensitivity = 0;
// CommSettings.fDtrControl = DTR_CONTROL_ENABLE;
// CommSettings.fOutxDsrFlow = 0;

SetCommState(m_hComhandle,&CommSettings);
    SetupComm(m_hComhandle,1024,1024);


COMMTIMEOUTS timeouts;
memset(&timeouts,0,sizeof(timeouts));
timeouts.ReadIntervalTimeout= MAXDWORD;
    timeouts.ReadIntervalTimeout=0;
    timeouts.ReadTotalTimeoutMultiplier=0;
    timeouts.ReadTotalTimeoutConstant=0;
    timeouts.WriteTotalTimeoutMultiplier=0;
    timeouts.WriteTotalTimeoutConstant=0;

//write data

DWORD dwWritten;
char pWrBuf[] = "#00?T*";
DWORD nLen = strlen(pWrBuf);
int nRet = 0 ;
OVERLAPPED ov;

memset(&ov,0,sizeof(ov));
ov.hEvent = CreateEvent( NULL,0,1,"writecom");
nRet = WriteFile(m_hComhandle,pWrBuf,nLen,&dwWritten,&ov);
if (0 == nRet)
{
WaitForSingleObject(ov.hEvent ,INFINITE);
}
CloseHandle(ov.hEvent);

//Colse port

CloseHandle(m_hComhandle);

我得串口测试程序如上。可以得到串口句柄,但是dwWritten=0,就是写不下去。那位兄弟能帮忙看看。
串口没接任何东西,应该可以写下去的啊!!
谢谢!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-13 14:52
你用同步方式写串口试试
Come on, let us drive the world.
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-13 14:54
谢谢,我是新手。怎么设同步?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-13 14:58
如:
m_hComhandle = CreateFile(
"COM2:", // 一定要有冒号
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,// Be zero
NULL);

nRet = WriteFile(m_hComhandle,pWrBuf,nLen,&dwWritten,NULL);
你试试吧,祝你好运!

[编辑 -  12/13/04 by  wwei_wang]
Come on, let us drive the world.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-13 15:14
我查了一下资料,上面说windows CE不支持重叠I/O操作。
Come on, let us drive the world.
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-13 15:29
谢谢
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-13 15:43
kevin_hou兄弟,问题解决了吗?
Come on, let us drive the world.
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-13 16:21
写下去了,但读不上来数据。有时候可以,但重启后就又不行了。有个现成的软件,他先运行后在运行我得程序就可以度上来。为什么啊!!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-13 16:26
你读串口数据的时候也不能用重叠I/O, 即lpOVERLAPPED=NULL。
你说“有个现成的软件”,是什么软件啊?能不能说得具体些。
Come on, let us drive the world.
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-13 16:35
// Read the data
COMSTAT CommStateInfo;
unsigned long iErrorCode;
DWORD dwRead;
int nRet = 0 ;
OVERLAPPED ovRead;
memset(&ovRead,0,sizeof(ovRead));

ovRead.hEvent = CreateEvent( NULL,0,1,"readcom");

ClearCommError(m_hComhandle, &iErrorCode, &CommStateInfo);

nLen = CommStateInfo.cbInQue;

nRet = ReadFile(m_hComhandle,pData,nLen,&dwRead,NULL);

CloseHandle(ovRead.hEvent );
这是我得读串口程序,那个软件是国外的软件,只有应用程序。看不到里面的内容,谢谢兄弟。
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-13 16:36
// Read the data
COMSTAT CommStateInfo;
unsigned long iErrorCode;
DWORD dwRead;
int nRet = 0 ;
OVERLAPPED ovRead;
memset(&ovRead,0,sizeof(ovRead));

ovRead.hEvent = CreateEvent( NULL,0,1,"readcom");

ClearCommError(m_hComhandle, &iErrorCode, &CommStateInfo);

nLen = CommStateInfo.cbInQue;

nRet = ReadFile(m_hComhandle,pData,nLen,&dwRead,NULL);

CloseHandle(ovRead.hEvent );
这是我得读串口程序,那个软件是国外的软件,只有应用程序。看不到里面的内容,谢谢兄弟。
CommStateInfo.cbInQue一直是0。
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-13 16:40
我觉得如果可能的话,你最好在驱动中设断点单步调试一下,查查问题究竟出在哪里?是出在应用与驱动的交互过程还是驱动与串口的交互过程。找到了原因,问题就容易解决了。
Come on, let us drive the world.
kevin_hou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2005-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-13 16:46
我单步跟踪到CommStateInfo.cbInQue=0,不知道问题在那?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-14 08:58
kevin_hou兄弟,你是用两个串口调试的,一个发一个收?还是怎么调的?你能保证串口肯定有数据进来吗?
Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-16 10:20
应该是这样的,在PC端上有个现成的程序,可以读,可以写,你自己在设备山也要写个程序,可以读,可以写,中间用cable线连起来,你的数据可以从你的AP写过去,但是从PC端写的数据你的AP读不出来,一般情况下,驱动中Tx,Rx很少有问题,主要就是你AP中读的那部分操作不行,你可以创建一个线程,一直循环读你的串口,在PC端一直向串口自动写数据(这个功能应该有吧),把这些数据写道文件里去,然后中止线程,看看有没有受到,要保证PC端一直有数据发过来
游客

返回顶部