如何用中断串口读取串口?

2023-12-12

我正在尝试在 Linux 中读取 NMEA 消息。但我无法得到完整的消息:

54.441,V,,,,,0.00,0.00,010720,,,N*42
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,020954.441,,,,,0,0,,,M,,M,,*43
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GPGLL,,,,,020954.441,V,N*71
$GP

第一行和最后一行是一条消息,但已被拆分。我认为,这是由睡眠1秒引起的。这根本不对。我想我应该使用中断串行。

我的想法是,当数据传入时,中断串行将运行一个读取串行并处理它的函数。之后,系统将休眠直到下一条消息。我搜索了一些材料,但没有帮助。

这是我的新代码,它不起作用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <errno.h>
#include <termios.h>

void signal_handler_IO ();  

int fd;
int connected;
struct termios termAttr;
struct sigaction saio;

int main(int argc, char *argv[])
{
     fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
     if (fd == -1)
     {
        perror("open_port: Unable to open port\n");
        exit(1);
     }
     saio.sa_handler = signal_handler_IO;
     saio.sa_flags = 0;
     saio.sa_restorer = NULL; 
     sigaction(SIGIO,&saio,NULL);

     fcntl(fd, F_SETFL, FNDELAY);
     fcntl(fd, F_SETOWN, getpid());
     fcntl(fd, F_SETFL,  O_ASYNC );

     tcgetattr(fd,&termAttr);       
     cfsetispeed(&termAttr,B9600);  
     cfsetospeed(&termAttr,B9600);  
     termAttr.c_cflag &= ~PARENB;   
     termAttr.c_cflag &= ~CSTOPB;   
     termAttr.c_cflag &= ~CSIZE;
     termAttr.c_cflag |= CS8;         
     termAttr.c_cflag |= (CLOCAL | CREAD); 
     termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
     termAttr.c_iflag &= ~(IXON | IXOFF | IXANY); 
     termAttr.c_oflag &= ~OPOST; 
     tcsetattr(fd,TCSANOW,&termAttr);
     printf("UART1 configured....\n");

     while(1){
         sleep(1);
     }
     close(fd);
     exit(0);   
          
}

void signal_handler_IO ()
{
    FILE *csv;
    char buff [1024];
    int n = read(fd, &buff, sizeof(buff));
    char * token = strtok(buff, ",");
    csv=fopen("csvfile.csv","w");
    while( token != NULL ) {
      fprintf(csv,"%s\n",token);
      token = strtok(NULL, ","); 
    }
    fclose(csv);
}

我现在应该怎么做 ?


NMEA 消息是lines,以'\n'.

Change read() to fgets()(打开使用fopen())并读作line into a string为以后strtok()加工。

也可以看看@克雷格·埃斯蒂 ideas.

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

如何用中断串口读取串口? 的相关文章

  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • MSVC10 /MP 在项目中跨文件夹构建非多核

    我希望有人指出我们所遇到的错误或解决方法 使用 MP 编译项目时 似乎仅同时编译同一文件夹中的文件 我使用进程资源管理器来滑动命令行并确认行为 项目过滤器似乎对同时编译的内容没有影响 项目结构disk Folder project vcxp
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用

随机推荐

  • 多重泛型歧义

    下面的代码完全相同 只是一个是C 另一个是VB Net C 编译得很好 但 VB Net 会抛出警告 接口 System IObserver Of Foo 与另一个接口不明确 由于 In 和 实现了接口 System IObserver O
  • 当“property”应用于实例变量“self.x”时,“超出最大递归深度”

    我正在阅读 property 我理解属性访问是通过 property 中指定的方法进行的 但是当执行以下代码时 我得到 运行时错误 超出最大递归深度 class Property object def init self self x Ra
  • 深色模式下嵌入 SVG 图像的问题

    标签内嵌入的 svg 图像不适用于媒体查询首选颜色方案和 CSS 变量 Chrome 和 Safari Firefox 可以
  • 保护Python代码免遭逆向工程

    我正在用 python 2 7 创建一个程序 我想保护它免受逆向工程的影响 我编译它使用cx freeze 提供基本的安全性 混淆和反调试 如何添加更多保护措施 例如混淆 加壳 反调试 加密代码识别VM 我想也许可以加密有效负载并在运行时解
  • Firefox Quantum 获取 url (VB.Net/C#)

    有人知道如何从 firefoxQuantum 获取 url 吗 我知道火狐浏览器 Dim DdeClient As New DdeClient Firefox WWW GetWindowInfo DdeClient Connect Dim
  • 如何保持网站宽度固定(无论屏幕尺寸如何)

    我正在设计一个网站 我希望我的网站宽度为 980px 我可以通过设置在笔记本电脑上轻松完成此操作right and leftCSS Box 的字段为 15 但我担心的是 当我的网站在另一台没有宽屏的电脑上打开时 这 15 会产生失真 无论屏
  • Mongodb聚合:如何对集合建模以返回树结构?

    https www mongodb com docs manual tutorial model tree structs with parent references 描述了 MongoDB 中树状结构建模的 5 种方法 并推荐使用 gr
  • 我可以在 SwiftUI 应用程序中使用视图控制器 (CalendarKit) 吗?

    我想在我的项目中使用 CalendarKitgithub在这里 它是使用 UIKit 编写的 但我的项目使用 SwiftUI 我可以用吗CustomCalendarExampleController在 SwiftUI 中 也许通过UIVie
  • 打印不带转义字符的 unicode 字符列表

    如果您有如下所示的带有 unicode 字符的字符串 您可以打印它 并获取未转义的版本 gt gt gt s gt gt gt s xc3 xa4 xc3 xa5 xc3 xb6 gt gt gt print s 但如果我们有一个包含上面字
  • 将命令的输出设置为变量(带管道)[重复]

    这个问题在这里已经有答案了 您可以使用管道将命令的输出重定向到变量吗 我没有尝试太多 因为我想不出什么可以尝试 但我尝试了一种方法 有两种变体 例如 echo Hello set text 没用 也没有 echo Hello set tex
  • 调用未定义的方法(laravel 5.2)

    我想显示用户的朋友 但我收到以下错误 Builder php 第 2345 行中的 BadMethodCallException 调用未定义 方法 Illuminate Database Query Builder friends 朋友控制
  • Symfony 2 - 使用 HTTP 身份验证对话框隐藏整个网站

    我正在使用 Symfony 2 构建网站 这项工作正在进行中 因此我不希望用户或搜索引擎访问它 但我的客户希望看到我的进度 我认为一个简单的解决方案是使用 Symfony 2 安全功能提供的机制通过 HTTP 身份验证来保护整个网站 我正在
  • 什么范围的 RGB 被视为“蓝色”?

    我得到的图像像素数据如下 var p c getImageData x y 1 1 data var red p 0 var green p 1 var blue p 2 抱歉 但我的问题与代码无关 什么范围的 RGB 被认为是蓝色 例如红
  • jQuery、JSON 和 Apache 问题

    我有一个 jQuery JSON 请求 它从另一个服务器 例如 foo com 加载一些 JSON getJSON http foo com json php function data alert data 但我收到的数据为空 这不是跨域
  • 如何将渐变可绘制设置为 FloatingActionButton 上的 backgroundTint 属性

    我想对浮动操作按钮使用渐变颜色而不是传统的纯色 我已经知道如何修改按钮的背景颜色 使用ColorStateList 有没有办法实现以下可绘制对象作为背景色调颜色 覆盖 xml
  • 如何在 Bootstrap 5 中使用单独的 JS 文件?

    我正在使用 Bootstrap 但想减小 Javascript 的大小 我只需要下拉 折叠 有时还需要轮播 所以我只想包含这些 每个脚本都有一个文件夹 dist 我尝试通过 SCRIPT 标签包含它们 它根本不起作用 并在控制台中产生很多错
  • Google 地图自动完成 API 未添加地址选项

    我正在尝试实现这个https developers google com maps documentation javascript examples places autocomplete addressform在使用 ASP NET 构
  • 同时使用 git2 和 hyper:openssl 链接多次

    我正在尝试构建同时使用 hyper 和 git2 的东西 现在我遇到了 openssl 链接两次的问题 提示牧马人带我去货运站features我尝试过 但我仍然卡住了 我遇到的确切错误cargo build如下 error native l
  • 如何在nativescript中访问webpack环境变量?

    我想在 webpack config js 中存储一个环境变量 当我在 Nativescript 中将应用程序与 webpack 捆绑在一起时 我将设置该环境变量 目标是即使在捆绑之后也能保持环境变量的秘密 我怎么做 我相信这应该是可能的
  • 如何用中断串口读取串口?

    我正在尝试在 Linux 中读取 NMEA 消息 但我无法得到完整的消息 54 441 V 0 00 0 00 010720 N 42 GPVTG 0 00 T M 0 00 N 0 00 K N 32 GPGGA 020954 441 0