C#中的串行端口信号读取接收到错误数据

C#中的串行端口信号读取接收到错误数据,c#,winforms,C#,Winforms,micro向我发送一个10位帧,其中第一位是Startbit,最后一位也是Stopbit。我使用以下程序获取数据,但数据是错误的;例如,当它向我发送21时,我接收33;当它向我发送83时,我接收131。 出什么事了 class Program { static void Main(string[] args) { dataCollector dc = new dataCollector(); dc.Start

micro向我发送一个10位帧,其中第一位是
Startbit
,最后一位也是
Stopbit
。我使用以下程序获取数据,但数据是错误的;例如,当它向我发送21时,我接收33;当它向我发送83时,我接收131。 出什么事了

class Program
    {
        static void Main(string[] args)
        {
            dataCollector dc = new dataCollector();
            dc.Start("COM23");
        }    
    public class dataCollector : IDisposable
    {    
        private static dataCollector collector;

        public dataCollector()
        {
            thread = new Thread(new ThreadStart(ThreadMain));
        }

        private Thread thread;
        private SerialPort port;
        private void ThreadMain()
        {
            try
            {
                if (port.IsOpen)
                    throw new Exception();
            }
            catch (Exception)
            {
                Console.Out.WriteLine("port is not open!!");
            }
            while (port.IsOpen)
            {
                try
                {
                    var b = port.ReadByte();
                    Console.Out.WriteLine(b);
                    //System.Threading.Thread.Sleep(2000);
                }
                catch (Exception) { }
            }
        }
        public void Start(string portName, int rate=2600)
        {

                port = new SerialPort("COM23");//baudrate is 2600;
                port.BaudRate = 9600; 
                //port.DataBits = 8;
                //port.StopBits = StopBits.One;
                //port.Parity = Parity.None;
                port.Open();
            thread.Start();
        }
        public void Stop()
        {

            if (port != null)
            {
                if (port.IsOpen) port.Close();
                if (thread.IsAlive) thread.Join();
                port.Dispose();
            }
        }

        public void Dispose()
        {
            Stop();
        }
    }

您的值实际上是正确的。发生的情况是,您在微控制器上看到的是十六进制值,但当您用c#打印出来时,这些值以十进制显示。使用您的示例,0x21是十进制的33,0x83是十进制的131


如果您更改了Console.Out.WriteLine(b)行
以十六进制格式显示,如下所示
Console.Out.WriteLine(“{0:x}”,b)您应该发现它们实际上是相同的。

您的值实际上是正确的。发生的情况是,您在微控制器上看到的是十六进制值,但当您用c#打印出来时,这些值以十进制显示。使用您的示例,0x21是十进制的33,0x83是十进制的131


如果您更改了Console.Out.WriteLine(b)行
以十六进制格式显示,如下所示
Console.Out.WriteLine(“{0:x}”,b)你应该发现它们实际上是一样的。

呵呵,这是我见过的最简单的串行端口数据损坏问题解决方案:)没问题。此外,如果这个答案充分回答了您的问题,请点击左侧上/下一票下方的已回答复选标记。呵呵,这是我见过的最简单的串行端口数据损坏问题解决方案:)没问题。此外,如果此答案充分回答了您的问题,请在左侧的向上/向下投票下方打上已回答的复选标记。