linux C++ 串口回显输出

2024-02-14

在我的程序中,将字节发送到串行端口,我收到发送的字节。我不想接收我发送的字节,并且我不知道该怎么做?

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/ioctl.h>

int fd;
struct termios tio, old_tio;

time_t SubTime_mSec(timeval val1, timeval val2)
{
    timeval tv;
    if (val1.tv_sec > val2.tv_sec) return (0);
    if (val1.tv_sec == val2.tv_sec)
        if (val1.tv_usec > val2.tv_usec) return (0);
    tv.tv_sec = val2.tv_sec - val1.tv_sec;
    if (val1.tv_usec < val2.tv_usec) {
        tv.tv_usec = val2.tv_usec - val1.tv_usec;
    } else {
        tv.tv_sec --;
        tv.tv_usec = 1000000 + val2.tv_usec - val1.tv_usec;
    }

    return(tv.tv_sec*1000 + tv.tv_usec/1000);
}


void RTUOutMessage(int cnt1, int cnt2)
{
    unsigned char msg[13] = {0x01, 0x10, 0x00, 0x2F, 0x00, 0x02, 0x04, 0x4B, 0x64, 0x3D, 0xD9, 0x36, 0xC6};
    int Len = 13;
    int status, i, j;
    ioctl(fd, TIOCMGET, &status);

    status = status | TIOCM_RTS | TIOCM_DTR;
    ioctl(fd, TIOCMSET, &status);
    write(fd, msg, Len);
    for (j = 0; j < cnt1; j ++)
        for (i = 0; i < cnt2; i ++);
    ioctl(fd, TIOCMGET, &status);
    status &= ~TIOCM_RTS;
    status &= ~TIOCM_DTR;
    ioctl(fd, TIOCMSET, &status);

    timeval start_t, curr_t;
    char Buff[80];
    int l;

    gettimeofday(&start_t, NULL);
    curr_t = start_t;
    while (SubTime_mSec(start_t, curr_t) < 1000) {
        l = read(fd, Buff, 80);
        if (l > 0) {
            printf("BUFFER=");
             for(i = 0; i < l; i++) {
                 printf(" %x", Buff[i]);
             }
             //printf("\n");
        }
        gettimeofday(&curr_t, NULL);
    }
}

void  InitPort(void)
{
    int StopBits = 2;
    if ((fd = open("/dev/ttyAM2", O_RDWR | O_NDELAY)) < 0) {
        printf("Couldn't open //dev//ttyAM2\n");
    }
    tcflush(fd, TCIOFLUSH);
    int n = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, n & ~O_NDELAY);
    tcgetattr(fd, &old_tio);
    tcgetattr(fd, &tio);
    cfsetospeed(&tio, (speed_t)B9600);
    cfsetispeed(&tio, (speed_t)B9600);
    tio.c_cflag = (tio.c_cflag & ~CSIZE) | CS8;
    tio.c_cflag |= CLOCAL | CREAD ;
    tio.c_cflag &= ~OFILL; 
    //parity
    tio.c_cflag &= ~(PARENB | PARODD);
    tio.c_cflag &= ~CRTSCTS;
    if (StopBits == 2) tio.c_cflag |= CSTOPB;
    else tio.c_cflag &= ~CSTOPB;
    tio.c_iflag=IGNBRK;
    tio.c_iflag &= ~(IXON|IXOFF|IXANY);
    tio.c_lflag=0;
    tio.c_oflag=0;
    tio.c_cc[VTIME]=0;
    tio.c_cc[VMIN]=0;
    if (tcsetattr(fd, TCSANOW, &tio)!=0) printf("tcsetattr() 1 failed\n");

    int mcs=0;
    ioctl(fd, TIOCMGET, &mcs);
    mcs |= TIOCM_RTS;
    ioctl(fd, TIOCMSET, &mcs);

    if (tcgetattr(fd, &tio)!=0) printf("tcgetattr() 4 failed\n");
    tio.c_cflag &= ~CRTSCTS;
    if (tcsetattr(fd, TCSANOW, &tio)!=0) printf("tcsetattr() 2 failed\n");
}

int main(int argc, char **argv)
{
    InitPort();
    int cnt1, cnt2;
    cnt1 = 3;
    cnt2 = 20000;
    cnt1 = atoi(argv[1]);
    cnt2 = atoi(argv[2]);
    for(;;) {
    RTUOutMessage(cnt1, cnt2);
    usleep(1000000);
    }
    tcsetattr(fd, TCSANOW, &old_tio);
    close(fd);
    printf("End\n");

    return 0;
}

如果您收到发送的字符,则遥控器的串行端口显然正在回显其输入。

您必须在其他设备上禁用输入回声,或者在接收逻辑中执行“回声消除”。 IE。创建一个“回显 FIFO”。输出到串行端口的每个字节也被写入“echo FIFO”。设置一个标志,指示预计会出现回声。当接收到输入时,将其与“echo FIFO”进行比较,并在匹配时删除字符,然后丢弃接收的字符。如果不匹配,则接受接收字符。当“echo FIFO”为空时,清除echo 标志。

顺便说一句,代码似乎将串行端口设置为原始或非规范模式。首选方法是使用

cfmakeraw(&tio);

而不是

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

linux C++ 串口回显输出 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 计算贝塞尔样条曲线以从一个点到另一个点

    我在 X Y 旋转中有 2 个点 我需要计算平滑连接这两个点的贝塞尔样条线 二次贝塞尔曲线的集合 见图 点代表游戏中只能缓慢旋转的单位 所以从A点到B点 必须走很长的路 附图显示了一条相当夸张的弯曲路径 但你明白了 我可以使用什么公式来计算
  • ">"(大于号)CSS 选择器是什么意思?

    例如 div gt p some class Some declarations 具体是做什么的 gt 标志是什么意思 gt is the child combinator https www w3 org TR selectors chi
  • Django 跨越关系

    我已阅读文档 但仍然出现错误 我有用户为目录对象下订单 我想创建一个查询 返回具有包含特定目录项的订单的所有用户 这是我的模型 class Catalog models Model name models CharField max len
  • 如何在没有 WordPress 插件的情况下添加多个特色图像上传按钮

    如何在不使用 WordPress 插件的情况下添加第二个特色图像上传按钮 你需要添加多后缩略图 admin js您还需要添加相同的过滤器以了解详细信息请参阅下面的链接 http lifeonlars com wordpress how to
  • 如何使用 Python 访问 Windows Vista 上的文件属性?

    问题就像标题一样简单 如何使用 Python 访问 Windows 文件属性 例如日期修改 更具体地说是标签 对于我正在执行的程序 我需要获取特定文件夹中各种文件的所有标签的列表 但我不确定如何执行此操作 我有 win32 模块 但我没有看
  • 如何通过单击按钮来调用 datagridview 事件?

    我想知道如何在 C 中调用事件 实际上 我有一个 datagridview 双击事件 它使用 datagridview 中选定行的值填充 f2 的文本框 并在分配的文本框中显示 form2 和这些值 现在我想通过单击一个按钮来做到这一点 比
  • 有没有办法控制默认使用哪个隐式转换?

    假设我有这个 class String2 val x String def times Int String val builder new StringBuilder for i lt 0 until times builder appe
  • SQL中调用动态函数名

    是否可以在 SQL 中调用具有动态名称的函数 例如 SELECT functionid SELECT results FROM dbo Function functionid AS results FROM List of Function
  • Jersey 2.x:如何在 RESTful 客户端上添加标头

    我已经看过了如何使用 Jersey Client API 在 RESTful 调用上添加标头 https stackoverflow com questions 18342456 how to add headers on restful
  • SQL Server 应用程序在 32 位和 64 位 SQL Server 版本之间的可移植性?

    我有一个当前正在针对 32 位 SQL Server 2005 标准版数据库运行的应用程序 由于我在此不赘述的原因 我需要将数据库移至在 64 位 Windows Server 2003 R2 Datacenter 上运行的 64 位 SQ
  • 使用 BouncyCastle 从文件中读取椭圆曲线私钥

    BouncyCastle 加密 API 允许使用常规方法创建和验证数字签名java security封装对象 例如java security PublicKey java security PrivateKey和他们的容器java secu
  • 我可以使用 socket.io-client 连接到标准 websocket 吗?

    尝试使用socket io client连接到用Go编写的websocket服务器 我已使用节点 WebSocket 库成功连接 npm https www npmjs org package ws 所以工作的 Websocket 代码如下
  • 解压一个类[重复]

    这个问题在这里已经有答案了 我想创建一个类来像字典一样解压它的对象 例如 使用字典 您可以这样做 foo a 1 b 2 def bar a b return a b bar foo outputs 3 我希望能够做到这一点 class F
  • “authenticate_user!”的设计实现在哪里?方法?

    设计实施在哪里authenticate user method 我一直在寻找 至今还没有找到 It s in lib devise controllers helpers rb1 https github com plataformatec
  • 如何将ListView分成多个部分并加载?

    我想知道我该如何划分我的ListView分成几部分 当用户启动我的应用程序时仅显示其中的一部分 并在用户按下名为 加载更多项目 的按钮时显示其他部分 我有一个包含 500 多个项目的大列表 并考虑将其分成几个部分 以便可以快速加载 我想要类
  • JQuery Datepicker:如果所选日期是今天的日期

    我可以使用以下方法确定所选日期是否是过去的日期 var due date due date val if new Date due date getTime lt new Date getTime do stuff 这工作正常 我使用以下内
  • 标签栏内存管理

    一个基于选项卡栏的应用程序 具有 5 个选项卡切换选项 我该如何有效地管理内存 选项卡之间的切换非常频繁我如何管理这种情况 or 无论如何 所有选项卡都会保持活动状态 但这是一个糟糕的选择 请详细描述有关标签栏内存管理的信息 让 UIKit
  • 在 VBA Excel 中复制和粘贴循环以实现多个输出

    所以我有以下 Excel 选项卡 代码 1 代码 2 代码 3 LI 2015 2016 2017 2018 2019 2015 年输出等 对于 2015 年 我在 2015 选项卡中有一个表 其中包含 10 行 3 个代码及其各自的 值的
  • 在按钮上移动手指时更改 textView

    在我的应用程序中 我有一个 Activity 其中有 9 个按钮和 1 个按钮textView 我正在利用OnTouchListener更改中的文本textView当我在按钮上移动手指时 This is what my activity l
  • linux C++ 串口回显输出

    在我的程序中 将字节发送到串行端口 我收到发送的字节 我不想接收我发送的字节 并且我不知道该怎么做 include