RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 894862
Accepted
JDo
JDo
Asked:2020-10-18 21:42:21 +0000 UTC2020-10-18 21:42:21 +0000 UTC 2020-10-18 21:42:21 +0000 UTC

从 COM 端口 C# .Net 读取数据

  • 772

我在单片机上写了一个程序,通过sprintf函数向端口发送数据(4个int类型的常量值),sprintf将int数转换为字符串。该字符串由 usart 发送的 ascii 字符的字节组成。

printf("+------- Pakage sending --------+");
sprintf(altitude,"alt: %d", ALT);

/* Send data to USART; */
timerDelayMs(300);
send_Uart_str(altitude);
send_Uart(NEW_LINE);
/* и тд. */

我打开终端并得到以下图片:

在此处输入图像描述

NEW_LINE 是 ASCII = 13 中的插入符号;

在 PC 端,我需要将每一行写入单独的缓冲区或变量。在这里我无法理解如何按马车划分。绘制了一个原始控制台应用程序。虽然我正在按事件从端口读取所有内容,但是在控制台中渲染时,同样的问题:

在此处输入图像描述

虽然在监视器中调试时,数据正常,没有损坏。实际的端口类:

 public class CustomSerialPort : SerialPort
{

    public event DataRecievedEventHandler DataChanged;
    public delegate void DataRecievedEventHandler(object sender, string package);

    public CustomSerialPort(string port)
        : base()
    {
        //base.PortName = COM1;
        base.BaudRate = 38400;
        base.DataBits = 8;
        base.StopBits = StopBits.One;
        base.Parity = Parity.None;
        base.ReadTimeout = 300;

        base.DataReceived += CustomSerialPort_DataReceived; ;
    }

    public void Open(string portName)
    {
        if (base.IsOpen)
        {
            base.Close();
        }
        base.PortName = portName;
        base.Open();
    }

    private void CustomSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        var port = (SerialPort) sender;
        try
        {
            DataChanged?.Invoke(sender, port.ReadExisting());
        }
        catch (Exception exception)
        {
            Debug.WriteLine(exception);
        }
    }
}

主程序:

 class Program
   {
    static void Main(string[] args)
    {
        var port = new CustomSerialPort("COM3");
        port.Open("COM3");

        port.DataChanged += Port_DataChanged;

        Console.ReadKey();
    }

    private static void Port_DataChanged(object sender, string package)
    {
        Console.WriteLine(package);
    }
}

可能是什么问题呢?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. MBo
    2020-10-19T00:43:30Z2020-10-19T00:43:30Z

    接收到的数据必须添加到一行 - 缓冲区。
    当 CR (NEW_LINE) 出现在缓冲区中时,复制它之前的所有内容并以所需的格式输出。
    删除缓冲区的开头,包括 CR

    PS DataChanged?.Invoke(确保事件处理程序的同步,该处理程序在单独的线程中执行,并且Port_DataChanged?

    • 2
  2. Best Answer
    ForNeVeR
    2020-10-20T16:08:42Z2020-10-20T16:08:42Z

    在这种情况下,奇怪输出的问题与符号有关,该符号'\r'也在NEWLINE所讨论的代码中(顺便说一句,这令人困惑,因为通常换行符毕竟是10,而不是13)。

    当'\r'输出到控制台时,这会将光标移动到当前行的开头。因此,在程序输出的某些行中,我们观察到包中的几行重叠,它们看起来很奇怪,像?888d: 1337.

    解决问题的步骤是将其替换Console.WriteLine(package)为Console.WriteLine(package.Replace("\r", "\n")). 更好的是Console.Write(package.Replace("\r", "\n")),这样数据包有时会停止在一条线的中间被切割。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5