从Matlab到C#的“fread(serial)”和“fscanf(serial)”

时间:2013-11-18 13:54:51

标签: c# matlab serial-port fread scanf

大家,

现在我正在根据一段matlab代码编写一个C#程序。

在matlab代码中,有两个命令可以从COM-Port读取数据:

A=fscanf(com_Port1,'%s');
A=fread(com_Port1,1008); //two sentences are next to each other like i write here.

对于第一个命令“A = fscanf(com_Port1,'%s');”我用过:

string A = com_Port1.ReadExisting();

似乎没事,因为没有错误警告;

表示第二个命令“A = fread(com_Port1,1008);”我用过:

double[] B = new double[1008];
for (int i = 0; i <= 1008 - 1; i++)
                {
                    B[i] = com_Port1.ReadByte() ;
                }

然后显示错误:

  

“发生了'System.TimeoutException'类型的第一次机会异常   在System.dll“。

所以我假设“ReadExisting”已经读取了所有数据,“ReadByte”无法再读取可用数据,是吗?有人能告诉我战争错在哪里吗?谢谢。

此致

亚当

在2013年11月20日添加,下面是我写的代码,我尝试过“Read()”,“ReadTo()”,“ReadLine()”,但我仍然在“otdr_Portobject.ReadByte”中收到错误)“,我不知道了。

 otdr_Portobject = new otdr_Port(cB_portNames.SelectedItem.ToString());

            otdr_Portobject.Open();
            btn_Stop.Enabled = true;
            btn_Start.Enabled = false;
            /*if (!otdr_Portobject.IsOpen)
            {
                MessageBox.Show("not open");
            }
            else {
                MessageBox.Show("Serial Port opened");
            };*/

            //string start = "start";
            otdr_Portobject.Write("start");
            char[] b9 = new char[7];
            otdr_Portobject.Read(b9, 0, 7);
            Thread.Sleep(5000);
            //string isready = "isready";
            otdr_Portobject.Write("isready");
            char[] b10 = new char[10];
            otdr_Portobject.Read(b10, 0, 10);
            //A = otdr_Portobject.ReadTo("\n");

            //string rdatb = "rdatb";
            int int32_Auslesekommando = Convert.ToInt32(pointsCon.Value-1);
            otdr_Portobject.Write("rdatb " + int32_Auslesekommando.ToString("X4") + "\n");
            Thread.Sleep(50);
            char[] b11 = new char[18];
            otdr_Portobject.Read(b11, 0, 18);
            //A = otdr_Portobject.ReadTo("\n");
            //A = otdr_Portobject.ReadTo("\n");
            //int A1=otdr_Portobject.ReadByte();

            //brechnen Y Axis
            int pointNum = Convert.ToInt32(pointsCon.Value);
            double[] B = new double[pointNum];

             //int byteNum=otdr_Portobject.BytesToRead;
            //if ( byteNum== 0) return;

           try
            {
                for (int i = 0; i <= pointNum - 1; i++)
                {
                    B[i] =System.Convert.ToDouble( otdr_Portobject.ReadByte() )* 256;
                }
            }
             catch(UnauthorizedAccessException ex)
            {
                MessageBox.Show(ex.Message);
            }

1 个答案:

答案 0 :(得分:0)

来自c#-docs:

ReadExsting:根据编码,在SerialPort对象的流和输入缓冲区中读取所有立即可用的字节。

MATLAB:

%s

fscanf格式:读取一系列字符,直到找到空格。

所以你应该切换到ReadTo,指定要停止的空白字符。

或者自己调用Read,直到返回的值为空白字符。