Linux主板支持多机系统的Mark/Space校验

2023-05-16

Linux主板支持多机系统的Mark/Space校验

 

  • 关键词: Linux 主板
  • 摘要:英创Linux主板可以通过RS485总线挂载多个单片机组成多机系统,当从机设备比较多、传输数据比较频繁的时候,单片机的负载将大大增加,影响正常的工作,比较通用的解决办法是充分利用串口固定校验位(Parity Stick)的功能,使用Mark/Space校验位区分地址和数据。

 

  英创Linux主板可以通过RS485总线挂载多个单片机组成多机系统,如图1所示,其中Linux主机作为上位机,单片机作为从机,485总线最多能挂载256个从机。系统工作的时候,每一个从机都有自己的地址(从机号),上位机首先发送从机的地址,再发送命令/数据,其发送的命令/数据可以被每一个从机接收,从机收到命令和数据后,如果地址和自己的相符,就进行应答。

 

图1 Linux主机与单片机组成的多机系统

 

图2 多机通信帧格式

 

  单片机每收到一个字节都要产生中断,在一般情况下,当Linux主机向从机1发送数据的时候,从机2、3在每一个字节都要产生中断,不论传输的是地址还是数据,也不论是不是跟自己通信。当从机设备比较多、传输数据比较频繁的时候,单片机的负载将大大增加,影响正常的工作。

 

  比较通用的解决办法是充分利用串口固定校验位(Parity Stick)的功能,使用Mark/Space校验位区分地址和数据,如图2所示的多机通信帧中,发送和接收地址字节时,可以使用Mark校验(也可以使用Space校验),发送和接收数据字节时,使用Space校验(也可以使用Mark校验)。系统初始化的时候,所有的从机都设置成Mark校验,进入等待状态。主机发送第一个字节(addr = 从机1)的时候使用Mark校验。这时,所有的从机都收到了addr,并通过校验产生中断。在从机的中断程序中,如果addr和自己的地址相符,就将从机设置成Space校验(从机1),否则,继续保持Mark校验(从机2、3)。紧接着,主机发送data1、data2的时候使用Space校验,这时,由于从机2、3不能通过Space校验,将不会产生中断,只有从机1会产生中断,应答主机。这样就大大降低了处于等待状态的从机2、3的中断负载。

 

  对Linux目前的串口驱动程序而言,在逻辑上应用程序可以先设置一次Mark校验位,write一个地址字节,再设置一次Space校验,接着write多个数据字节来实现多机通信。但是,两次调用write之间可能会有较大的时间间隙,导致单片机接收数据超时,多机通信失败。为此,英创公司专门修改了Linux串口驱动程序,在不增加新的API调用的前提下,只需要在应用程序中连续两次设置校验位即可使串口驱动进入ADDR_DATA_MODE模式,支持Mark/Space多机通信,并且将同一帧数据的addr、data连续发送出去(应用程序只调用一次write函数)。应用程序具体步骤如下(为方便校验位设置,编写了一个校验位设置函数):

 

  1、校验位设置函数

 

  int CSerial::SetParity(int parity)

  {

      struct termios new_opt;

      int status;

      unsigned int old_ccflag;

 

      tcgetattr(m_fd,&new_opt);

      old_ccflag = new_opt.c_cflag;

 

      new_opt.c_cflag &= ~PARODD ;

      new_opt.c_cflag &= ~CMSPAR ;

 

      if(parity == 0)

      {

          //使用Space校验 标记数据

          new_opt.c_cflag |= PARENB | CS8 | CMSPAR;

      }

      else if(parity == 1)

      {

          //使用Mark校验 标记地址

          new_opt.c_cflag |= PARENB | CS8 | CMSPAR | PARODD;

      }

      else if(parity == 2)

      {   //使用偶校验

          new_opt.c_cflag |= PARENB;      /* Enable parity */

          new_opt.c_cflag &= ~PARODD;     /* 转换为偶效验*/

      }

      else if(parity == 3)

      {

          //使用奇校验

          new_opt.c_cflag |= (PARODD | PARENB);   /* 设置为奇效验*/

      }

      else

      {

          new_opt.c_cflag = old_ccflag;

      }

      status = tcsetattr(m_fd,TCSANOW,&new_opt);

      return status;

  }

 

  2、主程序两次调用校验位设置函数,进入ADDR_DATA_MODE模式

 

  Buf[0] = 0x39;

   Buf[1] = 0xC1;

   Buf[2] = 0x80;

   Buf[3] = 0x1;

   Buf[4] = 0x0;

 

   //连续两次设置校验位,进入ADDR_DATA_MODE.

   //先设置数据使用的校验位,后设置地址使用的校验位

   m_Serial.SetParity(0);      //数据使用space校验

   m_Serial.SetParity(1);      //地址使用mark校验

   sleep(1);

   m_Serial.WritePort( Buf, 5 );

 

  如上程序将5个字节一起发送出去,其中Buf[0]作为地址,使用mark校验,Buf[1-4]作为数据,使用space校验,波形如图3所示。所有从机收到地址后,都通过校验位,产生中断,但仅地址为0x39的从机会将自己的校验位设置为0。之后Buf[1-4]仅有从机0x39能够产生接收中断,应答主机。

 

  发送完这5个字节后,就退出了ADDR_DATA_MODE模式,继续串口发送的所有字节都使用space校验(先设置的校验位)。如果需要其他校验方式,可以调用SetParity()进行设置。

 

图3 ADDR_DATA_MODE发送波形图

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

Linux主板支持多机系统的Mark/Space校验 的相关文章

  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh

随机推荐

  • 教大家防止Jar包被反编译

    xff08 待验证 xff09 方法就是 xff0c 向Jar注入无效代码 xff08 不合法的 xff0c 或者根本不是代码的字符串 xff09 那么无效的代码又怎么能正确运行呢 xff1f 答案就是 xff0c 你要保证你的代码永远不会
  • 推荐3个小程序开源组件库——Vant、iView、ColorUI

    推荐3个小程序开源组件库 在进行小程序开发时 xff0c 经常会遇到编写组件方面的阻碍 xff0c 这让我们花费大量的时间在页面以及 CSS 样式编写上 因此可以使用开源组件库 xff0c 有些复杂的组件可以直接拿来使用 xff0c 节省开
  • 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    两种原因 第一种为程序的运行以平台系统位数不匹配 第二种则是该死的VS整出来的 一般在下面三种情景下会发生 1 64位系统上C 调用32位的C 43 43 dll 2 64位系统上IIS发布含有32位的 dll应用程序时 3 64位系统上编
  • 怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法

    怎么在BIOS里设置硬盘启动 xff1f 电脑在启动时会从硬盘寻找引导文件 xff0c 从而启动系统 xff0c 如果硬盘不是第一启动项 xff0c 或者有两个硬盘 xff0c 就会导致系统无法启动 xff0c 这时候就需要进BIOS设置硬
  • Windows计划任务执行时不显示窗口的问题

    最近开发了工具 xff0c 带界面的 xff0c 需要定时执行的 xff0c 为了方便直接用Windows计划任务做定时了 跑了一段时间发现 xff0c 进程中也有 xff0c 就是看不到程序的界面 xff0c 进程的执行貌似也阻塞了 从网
  • JAVA的@EXCEL导出导入常用注解汇总

    在实际开发中经常需要使用导入导出功能来加快数据的操作 在项目中可以使用注解来完成此项功能 在需要被导入导出的实体类属性添加 64 Excel注解 参数类型默认值描述sortintInteger MAX VALUE值越小越靠前readConv
  • MySQL中order by排序将NULL排在最前或最后面

    NULL的意思表示什么都不是 xff0c 或者理解成 未知 也可以 xff0c 它与任何值比较的结果都是false 注意 xff1a 默认情况下 xff0c MySQL会认为NULL值比其他类型的数据小 xff0c 也就是说 xff1a 在
  • C# 如何获取本机IP

    百度搜索的方案 如果你去百度C 如何获取本机IP xff0c 那么大概率的你会得到以下的几段代码 xff0c 第一种就是这样 xff1a string name 61 Dns GetHostName IPAddress ipadrlist
  • winform DevExpress contextMenuStrip右键事件

    span class token keyword private span span class token return type class name span class token keyword void span span sp
  • Linux TCP连接数限制配置

    在进行接口测试时 xff0c 在用户数超过400后 xff0c 就会出现socket connection reset xff0c 明显就是系统无法创建连接 xff0c 查看此时系统建立的TCP连接 xff0c netstat ant gr
  • 摘要认证及实现HTTP digest authentication

    最近工作需要做了摘要认证 xff08 digest authentication xff09 xff0c 下面就工作中遇到的问题及过程做一个总结 第一次客户端请求 GET POST 服务器产生一个随机数nonce xff0c 服务器将这个随
  • HTTPURL Connection及session保存问题

    HTTPURL Connection及session保存问题 HTTPURL Connection是一种多用途 轻量极的HTTP客户端 xff0c 使用它来进行HTTP操作可以适用于大多数的应用程序 虽然HttpURLConnection的
  • SpringBoot 集成redis-jedis

    SpringBoot 集成redis jedis 配置application properties中的redis Redis配置 Redis数据库索引 xff08 默认为0 xff09 spring redis database 61 0
  • Python爬虫常用之登录(三) 使用http请求登录

    前面说了使用浏览器登录较为简单 不需要过多分析 而使用请求登录恰恰就是以分析为主 开发一个请求登录程序的流程 分析请求 gt 模拟请求 gt 测试登录 gt 调整参数 gt 测试登录 gt 登录成功 一 分析网页 从网页着手 打开博客园的登
  • memmove的算法思想

    1 memmove的用法 C 库函数 void memmove void str1 const void str2 size t n 从 str2 复制 n 个字符到str1 如果目标区域和源区域有重叠的话 memmove 能够保证源串在被
  • 菜菜之路-C语言求阶乘和

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 阶乘是什么 xff1f 二 思想 1 思路12 思路2总结 前言 C语言其实要学好并不简单碰到一道题我们有时根本无从下手
  • 题目:将一个正整数分解质因数。例如:输入90,打印出90=2 * 3 * 3 * 5

    思路1 xff1a 首先先提一个这样的思路 假如这个数是90 xff0c 我们让它被2到90之间的数进行整除 xff0c 如90 2 61 45 0 余数 xff0c 90 3 61 30 我们获取这样的除数 但是有问题 xff0c 90每
  • C语言--求比赛名次问题

    题目内容 xff1a 5位运动员参加了10米台跳水比赛 xff0c 有人让他们预测比赛结果 xff1a A选手说 B第二 xff0c 我第三 B选手说 我第二 xff0c E第四 C选手说 我第一 xff0c D第二 D选手说 C最后 xf
  • 编写程序,输入一个较小的实数deta,利用e=1+1/1(嘿哈)+1/2(嘿哈)+1/3(嘿哈)+⋯+1/n(嘿哈)计算e的近似值,直到最后一项的绝对值小于deta时为止,输出此时e的近似值。

    碰到了一种避开惯性思维的写法想分享出来 由于标题不能打叹号 你品一下哈 include lt stdio h gt include lt math h gt int main int n 61 1 double e 61 1 0 term
  • Linux主板支持多机系统的Mark/Space校验

    Linux主板支持多机系统的Mark Space校验 关键词 xff1a Linux 主板摘要 xff1a 英创Linux主板可以通过RS485总线挂载多个单片机组成多机系统 xff0c 当从机设备比较多 传输数据比较频繁的时候 xff0c