搜索
bottom↓
回复: 15

求助!用API函数编写的串口无法接收0x00【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-14 21:54:11 | 显示全部楼层 |阅读模式
最近用API函数编写了一个串口,但无法接收0x00,其它可以。是不是DCB中还要设置?请指数。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-11-16 20:54:58 | 显示全部楼层
不行啊'delphiDCB结构中没有DCB.fxxxxxx之类的成员,F开头的成员只有DCB.Flags,那怎样才能打开二制模式DCB.fBinary啊!

出0入0汤圆

 楼主| 发表于 2008-11-24 21:53:08 | 显示全部楼层
不会吧!我的是delphi 7.0 呀!系统也是xp sp2,我想不是版本问题,是delphi和c++不一样吧!

出0入0汤圆

发表于 2008-11-24 21:16:22 | 显示全部楼层
DELPHI没用过,不过用windows api的话,应该是一致的,估计你的版本太老了。

出0入0汤圆

发表于 2008-11-24 20:59:02 | 显示全部楼层
提供一个我用的API代码,一定能接收00H

  首先打开串口

  hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, bOverlapped ? FILE_FLAG_OVERLAPPED : 0, NULL);

  if (m_hComm == INVALID_HANDLE_VALUE){ ... }



  获取DCB

  DCB dcb;

  dcb.DCBlength = sizeof(DCB);

  GetState(dcb);



  修改DCB

  dcb.BaudRate = ...;

  dcb.Parity = ...;

  dcb.ByteSize = ...;

  dcb.StopBits = ...

  dcb.fDsrSensitivity = ...;

  dcb.fOutxCtsFlow = ...;

  dcb.fOutxDsrFlow = ...;

  dcb.fOutX = ...;

  dcb.fInX = ...;



  重设DCB

  SetState(dcb);

  

出0入0汤圆

 楼主| 发表于 2008-11-24 21:05:00 | 显示全部楼层
dcb.fDsrSensitivity = ...;

dcb.fOutxCtsFlow = ...;

dcb.fOutxDsrFlow = ...;

dcb.fOutX = ...;

dcb.fInX = ...

在delphi里沒有这样的成员,只有DCB.Flags这个。

我把DCB.Flags:=1;

DCB.Flags:=DCB.Flags+$800;

还是不行,无法接收0x00,真是纳闷.

出0入0汤圆

 楼主| 发表于 2008-11-24 20:35:19 | 显示全部楼层
还是不能接收0x00呀!有谁有例题供参考吗?先谢了?

出0入0汤圆

 楼主| 发表于 2008-11-25 15:38:20 | 显示全部楼层
呵呵!终于搞定左。

出0入0汤圆

 楼主| 发表于 2008-11-17 19:30:41 | 显示全部楼层
dcb.fBinary =1; //二进制模式

dcb.Parity = NOPARITY;

dcb.fParity = TRUE;

dcb.fOutxCtsFlow = FALSE;

dcb.fOutxDsrFlow = FALSE;

dcb.fInX = FALSE;

dcb.fOutX = FALSE;



以上是C++里的设置,那Delphi应该怎样才能做到以上的设置啊!

出0入0汤圆

 楼主| 发表于 2008-11-16 10:45:07 | 显示全部楼层
谢谢以上各位的指点,万分感激,回去试试.

出0入0汤圆

发表于 2008-11-15 22:46:59 | 显示全部楼层
int CDlg::OpenComm(CString com, int baud)

{

        hCom =CreateFile( com, 

                GENERIC_READ | GENERIC_WRITE,                          // 允许读写

                0,                                                // 此项必须为0

                NULL,                                                // no security attrs

                OPEN_EXISTING,                                        //设置产生方式

                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,

                NULL );

        

        if(hCom==INVALID_HANDLE_VALUE)                                //检测打开串口操作是否成功

        {

                AfxMessageBox("serial port file create error.");

                return 0;

        }

        SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );        //设置事件驱动的类型

        SetupComm( hCom, 1024,1024) ;                //设置输入、输出缓冲区的大小

        PurgeComm( hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );        //清干净输入、输出缓冲区

        

        //设置读写操作所允许的超时

        // COMMTIMEOUTS对象

        COMMTIMEOUTS comTimeOut;

        comTimeOut.ReadIntervalTimeout = -1;                  // 接收时,两字符间最大的时延

        comTimeOut.ReadTotalTimeoutMultiplier = 0;     // 读取每字节的超时

        comTimeOut.ReadTotalTimeoutConstant = 0;       // 读串口数据的固定超时  总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant

        comTimeOut.WriteTotalTimeoutMultiplier = 0;    // 写每字节的超时

        comTimeOut.WriteTotalTimeoutConstant = 5000;   // 写串口数据的固定超时

        if(SetCommTimeouts(hCom,&comTimeOut) == 0 )    // 将超时参数写入设备控制

        {

                AfxMessageBox("serial port SetCommTimeouts error.");

                return 0;

        }

        memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );

        memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

        m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

        m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

        

        

        DCB        dcb ;                                // 定义数据控制块结构

        GetCommState(hCom, &dcb ) ;                        //读串口原来的参数设置

        dcb.BaudRate =baud; 

        dcb.ByteSize =8; 

        dcb.Parity = NOPARITY;

        dcb.StopBits = ONESTOPBIT ;

        dcb.fBinary = TRUE ;

        dcb.fParity = FALSE;

        if(SetCommState(hCom, &dcb ) == 0 )                //串口参数配置

        {

                AfxMessageBox("serial port SetCommState error.");

                return 0;

        }

        m_isopen = 1 ;

        CreateThread(NULL,0,LPTHREAD_START_ROUTINE(thread_receive_prog),this,0,NULL);

        return 1;

}



本贴被 zc3909 编辑过,最后修改时间:2008-11-15,22:49:41.

出1070入962汤圆

发表于 2008-11-15 22:01:48 | 显示全部楼层
  typedef struct _DCB { // dcb 

        DWORD DCBlength;           // sizeof(DCB) 

        DWORD BaudRate;            // current baud rate 指定当前的波特率

        DWORD fBinary: 1;          // binary mode, no EOF check 指定是否允许二进制模式,WINDOWS 95中必须为TRUE

        DWORD fParity: 1;          // enable parity checking 指定奇偶校验是否允许

        DWORD fOutxCtsFlow:1;      // CTS output flow control 指定CTS是否用于检测发送控制.当为TRUE是CTS为OFF,发送将被挂起

        DWORD fOutxDsrFlow:1;      // DSR output flow control 指定DSR是否用于检测发送控制.当为TRUE是DSR为OFF,发送将被挂起

        DWORD fDtrControl:2;       // DTR flow control type DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",

        DWORD fDsrSensitivity:1;   // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略

        DWORD fTXContinueOnXoff:1; // XOFF continues Tx 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止.TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。

        DWORD fOutX: 1;            // XON/XOFF out flow control TRUE时,接收到XoffChar之后便停止发送.接收到XonChar之后将重新开始

        DWORD fInX: 1;             // XON/XOFF in flow control TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去.接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去

        DWORD fErrorChar: 1;       // enable error replacement 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符

        DWORD fNull: 1;            // enable null stripping TRUE时,接收时去掉空(0值)字节

        DWORD fRtsControl:2;       // RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,当接收缓冲区小于半满时RTS为ON 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF

        DWORD fAbortOnError:1;     // abort reads/writes on error TRUE时,有错误发生时中止读和写操作

        DWORD fDummy2:17;          // reserved 未使用

        WORD wReserved;            // not currently used 未使用,必须为0

        WORD XonLim;               // transmit XON threshold 指定在XON字符发送这前接收缓冲区中可允许的最小字节数

        WORD XoffLim;              // transmit XOFF threshold 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数

        BYTE ByteSize;             // number of bits/byte, 4-8 指定端口当前使用的数据位

        BYTE Parity;               // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

        BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

        char XonChar;              // Tx and Rx XON character 指定用于发送和接收字符XON的值

        char XoffChar;             // Tx and Rx XOFF character 指定用于发送和接收字符XOFF值

        char ErrorChar;            // error replacement character 本字符用来代替接收到的奇偶校验发生错误时的值

        char EofChar;              // end of input character 当没有使用二进制模式时,本字符可用来指示数据的结束

        char EvtChar;              // received event character 当接收到此字符时,会产生一个事件

        WORD wReserved1;           // reserved; do not use 未使用

    } DCB; 

出1070入962汤圆

发表于 2008-11-15 21:59:54 | 显示全部楼层
检查一下软件流控XON/XOFF,是否把0X00作为流控符号了。

出0入0汤圆

 楼主| 发表于 2008-11-15 21:39:10 | 显示全部楼层
自己顶上

出0入0汤圆

发表于 2008-11-16 22:47:38 | 显示全部楼层
s="baud=9600 parity=n data=7 stop=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off";

BuildCommDCB(s.c_str(),&dcb);

SetCommState(hComm, &dcb);

本贴被 ATmega32 编辑过,最后修改时间:2008-11-16,22:49:00.

出0入0汤圆

发表于 2014-4-29 15:40:48 | 显示全部楼层
ybx520 发表于 2008-11-25 15:38
呵呵!终于搞定左。

你好,请问你是怎么解决无法接收0x00的问题,我关闭了控制流还是无法接收。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 11:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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