第一步,先跟踪一下串口是否真正打开了;从你的代码来看if (sm.IsOpen == false)时,你还是往串口写数据了,这点是肯定不对的;
第二步,sm.WriteLine("READ?");执行完后,你立即就去读串口了,这时你的设备还没有来得及返回串口数据时,你等了500毫秒后又sm.WriteLine("READ?");这样反复10次,这样你肯定始终也读不到数据。
我的读串口数据的代码如下:
public byte[] ReadWriteSerialPortData(SerialPort CurrentCom, byte[] SendData, bool bAns, double dbMaxWaitTime, ref bool bRevDataOK)
{
byte[] ASend = new byte[SendData.Length + 3];
ASend[0] = Convert.ToByte("7F", 16);
ASend[1] = Convert.ToByte("7F", 16);
ASend[2] = Convert.ToByte("7F", 16);
for (byte i = 0; i < SendData.Length; i++)
{
ASend[i + 3] = SendData[i];
}
PubFunction pf = new PubFunction();
byte[] RevData = null;
byte iTimes = 0;
while (iTimes < 2)
{
CurrentCom.DiscardOutBuffer(); //清空发送缓冲区
CurrentCom.DiscardInBuffer(); //清空接收缓冲区
CurrentCom.Write(ASend, 0, ASend.Length);
if (bAns == false) //不需要应答
{
bRevDataOK = true;
return RevData;
}
DateTime dtStart = DateTime.Now;
double dbTime = 0;
RevData = null;
bRevDataOK = false;
while (true)
{
//pf.DelayTime(0.01); //延时10毫秒
int iLen = CurrentCom.BytesToRead;
if (iLen > 0)
{
byte[] btData = new byte[iLen];
CurrentCom.Read(btData, 0, iLen);
RevData = ByteArrayConcat(RevData, btData);
}
else
{
dbTime = DateTime.Now.Subtract(dtStart).TotalSeconds;
if (dbTime > dbMaxWaitTime) break;
else continue;
}
string strRevData = pf.GetArrayToSTR(RevData, false).ToUpper();
if ((strRevData.Equals("06")) || (strRevData.Equals("15")))
{
RevData = new byte[1];
if (strRevData.Equals("06")) RevData[0] = 6;
else RevData[0] = 21;
bRevDataOK = true;
break;
}
else
{
if ((strRevData.IndexOf("2F") >= 0) && (strRevData.IndexOf("0A") > 0))
{
strRevData = strRevData.Substring(strRevData.IndexOf("2F"), strRevData.IndexOf("0A") - strRevData.IndexOf("2F") + 2);
strRevData = strRevData.Replace(" ", "");
RevData = new byte[strRevData.Length / 2];
RevData = pf.HexStringToByteArray(strRevData);
bRevDataOK = true;
break;
}
else if (((strRevData.IndexOf("01") == 0) || (strRevData.IndexOf("02") == 0)) && (strRevData.IndexOf("03") > 0))
{
if (strRevData.IndexOf("03") + 5 == strRevData.Length)
{
strRevData = strRevData.Substring(0, strRevData.Length);
strRevData = strRevData.Replace(" ", "");
RevData = new byte[strRevData.Length / 2];
RevData = pf.HexStringToByteArray(strRevData);
bRevDataOK = true;
break;
}
}
}
}
if (bRevDataOK) break;
else
{
iTimes++;
pf.DelayTime(0.5); //延时0.5秒
}
}
return RevData;
}
以上代码希望对你有所帮助。