Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 串口通信初始化_C++_Windows_Winapi_Readfile_Serial Communication - Fatal编程技术网

C++ 串口通信初始化

C++ 串口通信初始化,c++,windows,winapi,readfile,serial-communication,C++,Windows,Winapi,Readfile,Serial Communication,当时我们正试图创建一个串行通信接口,以便能够与微处理器通信 事实上,一切都很好。几乎! 为了能够与控制器通信,我们需要与控制器同步。为此,我们编写了一个字符串:“?0{SY}13!”,然后控制器应该回复“!0{SY}F5?”,以接受同步请求。 为此,我们使用一个writeData函数(该函数有效-我们通过使用echo知道这一点),然后使用readData读取答案。 问题是,出于某种原因,它不会读取任何内容。虽然它返回1表示成功,但它读取的字符始终是”(无) 现在是奇怪的部分-如果我们使用外部终端

当时我们正试图创建一个串行通信接口,以便能够与微处理器通信

事实上,一切都很好。几乎! 为了能够与控制器通信,我们需要与控制器同步。为此,我们编写了一个字符串:
“?0{SY}13!”
,然后控制器应该回复
“!0{SY}F5?”
,以接受同步请求。 为此,我们使用一个
writeData
函数(该函数有效-我们通过使用
echo
知道这一点),然后使用
readData
读取答案。 问题是,出于某种原因,它不会读取任何内容。虽然它返回
1
表示成功,但它读取的字符始终是
(无)

现在是奇怪的部分-如果我们使用外部终端程序初始化端口(如putty),然后关闭程序,那么一切正常。它接受同步请求,回答(我们可以阅读),然后我们可以做我们想做的一切。但是,除非我们使用外部程序来初始化端口,否则它不会工作

初始化接口的构造函数如下所示:

SerialIF::SerialIF(int baud, int byteSize, int stopBits, char* parity, int debug)
{
    string coutport = getPort();    
    wstring wideport;               
    debug_ = debug;                 //Debuglevel

    sync = false;                   //sync starts with false

    error = false;                  //Error false as beginnging

    //this is just for converting to the right type
    for (int i = 0; i < coutport.length(); i++)
    {
        wideport += wchar_t(coutport[i]);  
    }
    const wchar_t* port = wideport.c_str();

    SerialIF::hserial = CreateFile(port,
        GENERIC_READ | GENERIC_WRITE,       
        0,
        0,
        OPEN_EXISTING,                      
        FILE_ATTRIBUTE_NORMAL,              
        0);
    if (hserial == INVALID_HANDLE_VALUE)
    {
        if (GetLastError() == ERROR_FILE_NOT_FOUND)
        {
            if (debug_ != LOW)
            {
                cout << "[-] Port " << coutport << "doesn't exist." << endl;  
            }
        }

        if (debug_ != LOW)
        {
            cout << "[-] Handle error - is there another terminal active?" << endl;
        }
        error = true;
    }

    DCB dcbParms = { 0 };
    dcbParms.DCBlength = sizeof(dcbParms);

    if (!GetCommState(hserial, &dcbParms))
    {
        if (debug_ != LOW)
        {
            cout << "[-] Couldn't get status from port " << coutport << endl;
        }
        error = true;  
    }

    if (!error)
    {
        setBaud(dcbParms, baud);
        setParity(dcbParms, parity);
        setByteSize(dcbParms, byteSize);
        setStopbits(dcbParms, stopBits);

        if (debug_ == HIGH)
        {
            cout << "[+] Serial port " << coutport << " has been activated. \nBaud-rate: " << baud << "\nParity: "
                << parity << "\nStop bits: " << stopBits << endl;
        }
    }
    else if (debug_ != LOW)
    {
        cout << "[-] Port not initialized" << endl;
    }
}
SerialIF::SerialIF(整数波特、整数字节大小、整数停止位、字符*奇偶校验、整数调试)
{
字符串coutport=getPort();
wstring宽端口;
debug_u=debug;//调试级别
sync=false;//同步从false开始
error=false;//开始时出错为false
//这只是为了转换到正确的类型
for(int i=0;i不能您从未调用
SetCommState

我不确定您的函数
setBaud
setParity
等来自何处,但我看不出它们实际上如何修改串行端口,因为它们无法访问通信设备的句柄。

ReadFile()即使读取零字节,也可以返回success。请使用dwBytesRead查找实际接收的字符数

while (ReadFile(hserial, buffer, 1, &dwBytesRead, NULL)) 
{
    if (dwBytesRead != 0)
    {
       store += buffer[0];

       if (buffer[0] == '?')  
       {                               
           end = true;     
           break;
       }
    }
}

在个人电脑和arduino纳米克隆(包括CH340)之间也有类似的问题。这篇文章是唯一一篇非常好地描述我的问题的文章。 我通过关闭DTR(数据终端就绪)和RTS(请求发送)流量控制解决了这个问题,在(重新)启动PC或插入arduino后,流量控制通常会激活。我在


我知道shis post非常古老,但也许我可以帮助其他人实现这个想法/解决方案。

初始化端口时会输出什么?例如,通过“[+]串行端口…”行可以提供readData()代码?@Greycon-我编辑了原始帖子以包含输出。@alexm我编辑了帖子。阅读一些关于握手含义的背景知识。我确实明白你的意思。GetCommState函数是唯一接收这些的函数。SetBaud等使用:“dcbParms.BaudRate=CBR_110”。我将尝试使用SetCommState…尽管它在将数据传递到dcb结构后使用SetCommState具有相同的效果:-(@BenjaminLarsen您应该能够通过在命令提示符中键入“MODE COMn:”来检查端口是否正确配置。或者,只需再次调用GetCommState(在不同的dcb中)另外,如果你的代码在PUTTY运行后运行,那么将在运行之后收到的DCB与安装程序运行后收到的DCB进行比较。哦,还有一件事:DCB中的StopBits字段非常不直观(0=1停止位,1=1.5停止位,2=2)。你应该使用
dcbParms.stoppits=onestoppit;
是的,我知道。我尝试了缓冲区中的所有内容。全部为空。问题可能在构造函数中出现-只是似乎无法使其工作。@BenjaminLarsen所以dwBytesRead不是零,对吗?啊!!这可能也是我的问题!谢谢!
while (ReadFile(hserial, buffer, 1, &dwBytesRead, NULL)) 
{
    if (dwBytesRead != 0)
    {
       store += buffer[0];

       if (buffer[0] == '?')  
       {                               
           end = true;     
           break;
       }
    }
}