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++ 串口回显输出 的相关文章

随机推荐

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

    我在 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