串口编程问题

coollcf 2013-10-20 12:37:36
我用API写了个打开串口读数据的程序,
现在问题来了.

我的程序接不到串口的数据.如果用超级终端打开端口再关闭后,

再开我的程序.就能接到数据.

不知道是哪里设置错了.有没有高手指点下.

设置参数代码如下:

GetCommState(hCom,&dcb);
dcb.DCBlength=sizeof(DCB);
dcb.BaudRate=nRate;//波特率
dcb.ByteSize=8;//数据位
dcb.fBinary=1;//停止位

dcb.StopBits=0;
dcb.Parity=NOPARITY;
dcb.fParity=MARKPARITY;

dcb.fOutxCtsFlow = false; // Disable CTS monitoring
dcb.fOutxDsrFlow = false; // Disable DSR monitoring
dcb.fDtrControl = DTR_CONTROL_DISABLE; // Disable DTR monitoring
dcb.fOutX = false; // Disable XON/XOFF for transmission
dcb.fInX = false; // Disable XON/XOFF for receiving
dcb.fRtsControl = RTS_CONTROL_DISABLE; // Disable RTS (Ready To Send)

SetCommState(hCom,&dcb);

SetCommMask(hCom,EV_RXCHAR);
EscapeCommFunction(hCom,SETDTR);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
...全文
153 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2013-10-22
  • 打赏
  • 举报
回复
出现乱码 往往是 汉字 被 分成 2个 字节 在 2次 接受中 错误处理。
coollcf 2013-10-22
  • 打赏
  • 举报
回复
测试过了. // 错误处理 m_dcb.fAbortOnError = TRUE; 这里不能为TRUE 否则会出现995错误. 折腾了一天,也没找到真正的原因. 只留这几个参数 dcb.BaudRate=nRate;//波特率 dcb.ByteSize=8;//数据位 dcb.StopBits=0;//停止位 dcb.Parity=NOPARITY; dcb.fBinary=1; 也可以正常使用. 有时会出现乱码.
coollcf 2013-10-21
  • 打赏
  • 举报
回复
等下我再试下.昨天周末,没有测试.
schlafenhamster 2013-10-20
  • 打赏
  • 举报
回复
“超级终端流控制选择无,它也能接到数据” 说明下位机 没用 流控制。 DCB中 关于流控制的 都不要 动他。
coollcf 2013-10-20
  • 打赏
  • 举报
回复
对流控制不会.请问要如何设置,软,硬,无控制? 我跟过SetCommState,它会设置SETRTS 超级终端流控制选择无,它也能接到数据.
schlafenhamster 2013-10-20
  • 打赏
  • 举报
回复
是有 流控制吗 ? EscapeCommFunction(hCom,SETDTR); 试试: EscapeCommFunction(pMyComInfo->hCom, SETRTS); //发送RTS (request-to-send)信号
coollcf 2013-10-20
  • 打赏
  • 举报
回复
设备是是电子称..
爱一个人123456 2013-10-20
  • 打赏
  • 举报
回复
能和S7 200串口连吗
coollcf 2013-10-20
  • 打赏
  • 举报
回复
你是指设备要接到数据后才会发数据? 那设备只发数据. 不知道超经终端怎么就能接到数据.
碼上道 2013-10-20
  • 打赏
  • 举报
回复
连上串口后,先发任意一个字符过去看看,
schlafenhamster 2013-10-20
  • 打赏
  • 举报
回复
例子: // ---------------------------------- ConfigurePort --------------------- //配置COM口 //输入:DWORD baud 波特率(19200,38400) // DWORD byteSize 数据位(7,8) // DWORD parity 奇偶位 // DWORD stopBits 停止位(1,2) // DWORD checkParity 是否要奇偶校验(默认TRUE) BOOL CRS232Port::ConfigurePort(DWORD baud,DWORD byteSize,DWORD parity,DWORD stopBits,DWORD checkParity) { BOOL error; COMMTIMEOUTS timeout; if (INVALID_HANDLE_VALUE == m_h232Port) { CString errMsg("错误: 不能设置RS232口.端口未打开!"); RSDataMessage(errMsg); AfxMessageBox(errMsg, MB_OK|MB_ICONEXCLAMATION); return FALSE; } // 取得原DCB,然后填要求值 error = GetCommState(m_h232Port,&m_dcb); // 然后填要求值 m_dcb.BaudRate = baud; m_dcb.ByteSize = (BYTE)byteSize; m_dcb.Parity = (BYTE)parity; m_dcb.fParity = checkParity; m_dcb.StopBits = (BYTE)stopBits; // 置默认参数 m_dcb.fOutxDsrFlow = FALSE; m_dcb.fDsrSensitivity = FALSE; m_dcb.fOutxCtsFlow = FALSE; // 置口的握手信号,(不用握手信号) m_dcb.fRtsControl = RTS_CONTROL_ENABLE; m_dcb.fDtrControl = DTR_CONTROL_ENABLE; m_dcb.fTXContinueOnXoff = FALSE; m_dcb.fOutX = FALSE; m_dcb.fInX = FALSE; // 错误处理 m_dcb.fAbortOnError = TRUE; m_dcb.fErrorChar = 0; // 格式 m_dcb.fBinary = TRUE; m_dcb.fNull = 0; m_dcb.fDummy2 = 0; // 置新的值 error = SetCommState(m_h232Port,&m_dcb); CString paramsSet; if (!error) { CHAR errorMsg[MAX_ERROR_STR_LEN]; CHAR *errorMsgPtr = errorMsg; DWORD ntError = GetLastError(); // 使用默认系统语言 errorMsg[0] = '\0'; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, // ignored, search the system only ntError, // error code passed in GetSystemDefaultLangID(),// English ,English US errorMsg, // message buffer sizeof(errorMsg), // length NULL); // optional parameter list // 用空格代替回车 while(*errorMsgPtr) { errorMsgPtr++; if (( *errorMsgPtr == '\r') | ( *errorMsgPtr == '\n')) *errorMsgPtr = ' '; } paramsSet.Format("配置串口错误: 波特率%d,数据位%d,奇偶位%c,停止位%d : (错误: %d) - %s", baud, byteSize, commsParityStr[parity], stopBits, ntError, errorMsg); RSDataMessage(paramsSet); AfxMessageBox( paramsSet, MB_OK | MB_ICONEXCLAMATION); ClosePort(); return FALSE; } // Set up the timeouts to use, they are quite short, since we will loop anyway. // Do not make them zero, else we will have a CPU load problem. Too large a value, // and we have to wait for comms to time out when shutting down // 填 timeout 结构 GetCommTimeouts(m_h232Port, &timeout); timeout.ReadIntervalTimeout = 100; // 500ms between incomming chars. timeout.ReadTotalTimeoutConstant = 500; timeout.ReadTotalTimeoutMultiplier = 0; // chars to read does not add to timeout amount timeout.WriteTotalTimeoutConstant = 2000; timeout.WriteTotalTimeoutMultiplier = 60; // 60ms per char sent error = SetCommTimeouts(m_h232Port, &timeout); if (! error) { CString errMsg("错误: 不能置超时参数!"); RSDataMessage(errMsg); AfxMessageBox(errMsg, MB_OK|MB_ICONEXCLAMATION); ClosePort(); return FALSE; } // return (TRUE); } // ConfigurePort
coollcf 2013-10-20
  • 打赏
  • 举报
回复
那是什么原因 ?我少设置了什么?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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