u011756552
123YYD
采纳率44.4%
2018-08-28 01:28

c++串口通信问题吗,返回的是cccccc......,附上源码,新手求助!!!

40
已采纳

#include "stdafx.h"
#include
#include

using namespace std;

HANDLE InitCOM(LPCTSTR Port)
{
HANDLE hCom = INVALID_HANDLE_VALUE;
hCom = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
0/*同步方式打开串口*/, NULL);
if (INVALID_HANDLE_VALUE == hCom)
{
return INVALID_HANDLE_VALUE;
}
SetupComm(hCom, 4096, 4096);//设置缓存

DCB dcb;

GetCommState(hCom, &dcb);//设置串口
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_9600;
dcb.StopBits = ONESTOPBIT;
SetCommState(hCom, &dcb);

PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清空缓存

COMMTIMEOUTS ct;
//设置读取超时时间,及ReadFlie最长等待时间
ct.ReadIntervalTimeout = 0;
ct.ReadTotalTimeoutConstant = 5000;
ct.ReadTotalTimeoutMultiplier = 500;

ct.WriteTotalTimeoutMultiplier = 500;
ct.WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(hCom, &ct);//设置超时

return hCom;

}
bool ComRead(HANDLE hCom, LPBYTE buf, int &len)
{
DWORD ReadSize = 0; //是无符号的, 相当于unsigned long
BOOL rtn = FALSE;

//设置读取1个字节数据,当缓存中有数据到达时则会立即返回,否则直到超时
rtn = ReadFile(hCom, buf, 1, &ReadSize, NULL);

//如果是超时rtn=true但是ReadSize=0,如果有数据到达,会读取一个字节ReadSize=1
if (rtn == TRUE && 1 == ReadSize)
{
    DWORD Error;
    COMSTAT cs = { 0 };
    int ReadLen = 0;
    //查询剩余多少字节未读取,存储于cs.cbInQue中
    ClearCommError(hCom, &Error, &cs);
    ReadLen = (cs.cbInQue > len) ? len : cs.cbInQue;
    if (ReadLen > 0)
    {
        //由于之前等待时以读取一个字节,所欲buf+1
        rtn = ReadFile(hCom, buf + 1, ReadLen, &ReadSize, NULL);
        len = 0;
        if (rtn)
        {
            len = ReadLen + 1;
        }
    }
}
PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);
return rtn != FALSE;

}
bool ComWrite(HANDLE hCom, LPBYTE buf, int &len)
{
PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);
BOOL rtn = FALSE;
DWORD WriteSize = 0;
rtn = WriteFile(hCom, buf, len, &WriteSize, NULL);

len = WriteSize;
return rtn != FALSE;

}
int main()
{
HANDLE hCom = InitCOM("COM4");

string str = "0a010100000a";
unsigned char b[216];
unsigned char a[6] = { 0xa5,1,1,0,0,0x0a };

//LPBYTE buf;
//m_cs.Lock();//每一个操作前先锁定设备
int len = 6;
int rlen = 216;
bool issend = ComWrite(hCom, a, len);
if (issend)
{
    printf("发送成功!\n");
}

Sleep(3*1000);

bool isread = ComRead(hCom,b,rlen);

if (isread)
{
    printf("接收成功!\n");
}

for (int i = 0; i < 216; i++)
{
    printf("%x",b[i]);
}
system("pause");

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • phenix2009 白色一大坨 3年前

    你这个串口的波特率和停止位设置了,校验位和数据位的设置在哪里?
    还是说默认的设置以及是9和None了?

    点赞 1 评论 复制链接分享
  • hxy1975 南京123 3年前

    你找个程序是有串口返回数据的,只是在接收的时候出了问题。
    1、你用异步方式打开串口,因为同步有可能产生竞争问题。
    2、你发出数据后启动一个定时器,用延时来读取数据。
    不要去一位一位的度,延时后一次读取,如果超时就认为是出错了

    点赞 1 评论 复制链接分享
  • VisualEleven Eleven 3年前

    先检测一下发送的数据是否正确?

    点赞 1 评论 复制链接分享
  • phenix2009 白色一大坨 3年前

    最重要一点,你可以把设备协议描述一下吧,你程序里面发了 0xa5,1,1,0,0,0x0a这几个字节出去,你确定这个是跟你设备协议相符的数据?

    点赞 1 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前

    是这样的,vc++的调试版本会将分配的内存自动用0xcc填充。(这也是烫烫烫烫典故的由来,烫的内码就是0xcccc)
    所以,如果“返回”cccc,实际上说明你根本就没有返回,内存没有写入任何东西。
    给你的建议就是,串口的vc++的源代码很多,建议你先找一个现成的试试看。

    点赞 评论 复制链接分享
  • u011756552 123YYD 3年前

    上图是串口助手返回数据

    点赞 评论 复制链接分享
  • u011756552 123YYD 3年前

    图片说明串口助手返回数据

    点赞 评论 复制链接分享