大家,
现在我正在根据一段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);
}
答案 0 :(得分:0)
来自c#-docs:
ReadExsting:根据编码,在SerialPort对象的流和输入缓冲区中读取所有立即可用的字节。
MATLAB:
%s
的 fscanf
格式:读取一系列字符,直到找到空格。
所以你应该切换到ReadTo
,指定要停止的空白字符。
或者自己调用Read
,直到返回的值为空白字符。