串口通信初始化

2024-02-10

目前我们正在尝试创建一个串行通信接口,以便能够与微处理器进行通信。

事实上 - 一切都很好。几乎! 为了能够与我们的控制器通信,我们需要与其同步。为此,我们编写一个字符串:"?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;
    }
}

这应该有效 - 我真的不知道为什么它不应该。它没有返回错误,我在过去几天尝试了很多错误搜索,我尝试了超时,我尝试了其他构建它的方法,但这一切都归结为同一问题。

为什么这不会初始化端口?

EDIT:

尝试同步时的输出: 由于缺乏信誉,无法发布图片。虽然它输出如下:

[+] 串口COM1已激活。 波特率:9600 奇偶校验:无 停止位:1

[+] -> ?0{SY}13!被写入端口。 ((这就是进入无限循环读取“”的地方))

编辑:读取代码:

const int bytesToRead = 1;              //I byte pr læsning
char buffer[bytesToRead + 1] = { 0 };   //Bufferen til data
DWORD dwBytesRead = 0;                  //Antal bytes læst
string store;                           //Store - den vi gemmer den samlede streng i
bool end = false;                       //Kontrolvariabel til whileloop.

while (end == false)                    
{
    if (ReadFile(hserial, buffer, bytesToRead, &dwBytesRead, NULL)) 
    /*Readfile læser fra interfacet vha. hserial som vi oprettede i constructoren*/
    {
        if (buffer[0] == '?')           //Da protokollen slutter en modtaget streng med "?", sætter vi end til true 
        {                               //Hvis denne læses.     
            end = true;     
        }
        store += buffer[0];
    }
    else
    {
        if (debug_ != LOW)
        {
            cout << "[-] Read fail" << endl;    //Hvis readfile returnerer false, så er der sket en fejl. 
        }
        end = true;
    }
}

if (debug_ == HIGH)
{
    cout << "[+] Recieved: " << store << endl;  //I forbindelse med debug, er det muligt at få udsrkevet det man fik ind.
}

recentIn = store;                               //RecentIN brugES i andre funktioner                
if (verify())                                   //Som f.eks. her, hvor vi verificerer dataen
{
    if (debug_ == HIGH)
    {
        cout << "[+] Verification success!" << endl;
    }
    return convertRecData(store);
}
else
{
    if (debug_ != LOW)
    {
        cout << "[-] Verification failed." << endl;
    }

    vector <string> null;   //Returnerer en string uden data i, hvis der er sket en fejl.
    return null;
}

你从不打电话SetCommState.

我不确定你的功能在哪里setBaud,setParity等来自,但我看不到他们如何实际修改串行端口,因为他们无权访问通信设备的句柄。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口通信初始化 的相关文章

随机推荐

  • 根据长度对集合 进行排序

    我的问题与this https stackoverflow com questions 3844721 algorithm to generate all permutation by selecting some or all chara
  • 数据框从宽到长,具有多个变量和 ID R [重复]

    这个问题在这里已经有答案了 我有一个数据框 其中包含参与者对两个文本的判断 假设每个文本都有正确答案和标识符 并且每个文本都被判断多次 set seed 123 wide df data frame participant id LETTE
  • sklearn.* 模块在 0.22 版本中已弃用,并将在 0.24 版本中删除

    我正在将一个软件从 Python 2 7 迁移到 Python 3 出现的一个问题是 sklearn neighbors kde 模块在版本 0 22 中已弃用 并且 将在 0 24 版本中删除 对应的类 函数 应该从 sklearn ne
  • 将计算的 xpage 字段绑定到表单字段

    关于将数据绑定到表单存在很多问题 这很简单 我有一个表单 它使用多个计算字段 这些字段使用 DbLookup 提取数据 以根据用户选择的下拉菜单填充字段 问题是 没有一个计算字段将任何值保存到它所绑定的形式中 表单上保存的唯一数据是手动选择
  • 春季云配置搜索路径

    我正在考虑通过 Spring Cloud Config 实现 12factor 方法来外部化配置 但无法按照我的预期使用 searchPaths 使通配符正常工作 文档http cloud spring io spring cloud co
  • SQL中检查字段是否包含特殊字符

    我们决定使用Nvarchar在某些表中存储一些信息 原因是我们假设我们将有很多特殊字符 因为数据库包含法语和德语数据 提取一些数据后 我们估计完整运行的大小非常巨大 20 TB 现在我们想检查每个表以查找是否找到特殊字符 如果没有 那么我们
  • add_custom_command -- 在重建时更新依赖项列表

    查看上次状态更新 初始条件 代码生成器 生成一组 C 源代码 以一个输入文件作为参数 输入文件可能包含其他输入文件 已经解决了获取输出文件列表 解析输入代码生成文件以获取代码生成输入的完整列表的任务 IE 首次为 add custom co
  • 防止 IIS 通过 ASP.NET 管道提供静态文件

    对我的 css js 图像文件的请求是通过 ASP NET 管道提供的 我认为 IIS 默认情况下会避免这种情况 但我在我的网站上看到了这些请求Application AuthenticateRequest断点 并且不需要实际验证这些请求
  • 在AWS Lambda执行环境上安装第3方库

    我需要为 AWS Lambda 函数安装本机库 使用 RPM 我已经发现这篇博文 https aws amazon com blogs compute nodejs packages in lambda 本机模块部分 但我不知道在哪里编写这
  • 设计WCF数据契约和操作

    我开始设计一个 wcf 服务总线 它现在很小 但会随着我们业务的增长而增长 所以我担心一些日益严重的问题 并尽量不要 YAGNI 太多 这是一个电子商务平台 问题是我对把东西放在哪里犹豫了太多 我将给出一个场景来展示我所有的问题 我们有一个
  • Android:如何使用下载管理器类?

    我想从 url 下载二进制文件 是否可以使用我在这里找到的 Android 下载管理器类下载管理器类 http developer android com reference android app DownloadManager html
  • 在 Clojure 命名空间中排除 java.lang.*

    是否有可能从 Clojure 命名空间中的 java lang 中排除类名 我需要使用像 Byte 和 String 这样的变量 这里 java lang 类名就出现了 也许类似 ns my ns exclude java lang 如果您
  • 何时使用重新编译

    请耐心等待 我无法包含我的 1 000 多行程序 并且描述中有几个问题 所以我正在寻找几种类型的模式 literally just a regular word re search Word arg Varying complex patt
  • 如何重命名大量文件

    我有一个包含这样的文件的目录 a JPG b JPG c JPG 我想做这样的事情 git mv a JPG a jpg 我尝试使用 xargs 和其他工具 但似乎没有任何效果 该解决方案的核心是使用一种工具 方法来自动执行批量重命名 您可
  • 将knockout.js 与django 表单一起使用?

    我希望向我的客户端代码添加一些结构 并且一直在阅读knockout js 我一直在阅读文档并有一个简单的问题要问 因为淘汰赛要求用户添加data bindhtml 元素的属性 它的最佳使用方式是什么django表格 因为目前我正在使用 fo
  • jmeter http请求的每个线程的唯一ID

    我的 jmeter 测试发出一个包含唯一 ID 的 http 请求 http myserver com uniqueId 我想为每个线程设置基数 比如 35000 和增量 例如我的 id 是 35001 35002 35003 http m
  • 类的指针与非指针成员

    我的问题是 假设我们有两个类 A 和 B 我想在 A 类中有一个 B 的对象 我应该使用 class A public A A B b or class A public A A B b 据我所知 在第一种情况下 我可以初始化对象 b us
  • C# - 带种子的随机数

    我有这个代码 var rand new Random 0 for int i 0 i lt 100 i Console WriteLine rand Next 0 100 程序应该给我相同数字的 100 倍 因为种子是相同的 但它给出了不同
  • 如何仅打印 hexdump 中的十六进制值而不显示行号或 ASCII 表? [复制]

    这个问题在这里已经有答案了 下列的在 UNIX shell 脚本中将十进制转换为十六进制 https stackoverflow com questions 378829 convert decimal to hexadecimal in
  • 串口通信初始化

    目前我们正在尝试创建一个串行通信接口 以便能够与微处理器进行通信 事实上 一切都很好 几乎 为了能够与我们的控制器通信 我们需要与其同步 为此 我们编写一个字符串 0 SY 13 然后控制器应该回复 0 SY F5 接受同步请求 为此 我们