用DataReceive读取串口的数据,自定义收发协议,可以正常发送。
但是接收的时候,如果在datareceive中加上断点进行单步调试,就可以收到其他手机发来的短信内容;
如果不加断点直接运行,就没有反应,接收不到短信内容。
各位大侠有没有碰到过?帮忙提示一下是怎么回事,谢谢。
但是接收的时候,如果在datareceive中加上断点进行单步调试,就可以收到其他手机发来的短信内容;
如果不加断点直接运行,就没有反应,接收不到短信内容。
各位大侠有没有碰到过?帮忙提示一下是怎么回事,谢谢。
string a = serialPort.ReadLine();
serialPort.DiscardInBuffer();
/// <summary>
/// 接收到数据时触发该事件
/// </summary>
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
try
{
System.Threading.Thread.Sleep(200);
string data = this.serialPort1.ReadExisting();
//下面略……
是需要在其他地方放休眠等待吗?
试试:SerialPort serialPort = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(500);
try
{
txtReceive.Text = serialPort.ReadExisting();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
//处理错误
}
参考一下网上是怎么写的:c#serialport类实现串口通信的源代码
to:wapit,我参考你的意见在datareceived中加了methodinvoker委托,在InvokeReceivedData中进行了延迟500ms的处理,可以直接接收到内容了,可是接收到的内容却不完整了。请问你在委托里处理什么?怎么养保证接收到完整的内容。
下面这个是部分代码:
private void ConnectSMS()
{
if (SpSMS.IsOpen)
{
SpSMS.Close();
bSMSSucceed = false;
}
SpSMS.PortName = sSMSCom;
SpSMS.BaudRate = int.Parse(sSMSBand);
SpSMS.RtsEnable = true;
SpSMS.DtrEnable = true;//??
SpSMS.WriteTimeout = 1000;//写超时,如果底层串口驱动效率问题,能有效的避免死锁
SpSMS.ReadTimeout = 1000;//读超时,同上
//SpSMS.NewLine = "";//如果有行结束符标记就设定
//SpSMS.Handshake = Handshake.RequestToSendXOnXOff;
//SpSMS.Handshake = Handshake.XOnXOff;//
if (sSMSParity == "None")
SpSMS.Parity = Parity.None;
else
{
if (sSMSParity == "Odd")
SpSMS.Parity = Parity.Odd;
else
{
if (sSMSParity == "Even")
SpSMS.Parity = Parity.Even;
else
{
if (sSMSParity == "Mark")
SpSMS.Parity = Parity.Mark;
else
SpSMS.Parity = Parity.Space;
}
}
}
if (sSMSStops == "None")
SpSMS.StopBits = StopBits.None;
else
{
if (sSMSStops == "One")
SpSMS.StopBits = StopBits.One;
else
{
if (sSMSStops == "Two")
SpSMS.StopBits = StopBits.Two;
else
SpSMS.StopBits = StopBits.OnePointFive;
}
}
//
SpSMS.DataReceived += new SerialDataReceivedEventHandler(SpSMS_DataReceived);
SpSMS.ReceivedBytesThreshold = 1;//设置引发OnComm事件的字节长度
try
{
SpSMS.Open();
SpSMS.WriteLine("AT\r\n");
Thread.Sleep(100);
SpSMS.WriteLine("AT+CNMI=2,2\r\n");
Thread.Sleep(100);
SpSMS.WriteLine("AT+CMGF=0\r\n");
bSMSSucceed = true;
SetSMSStatus();
}
catch
{
bSMSSucceed = false;
}
}
//发送接收短信处理事件
public void SpSMS_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
System.Threading.Thread.Sleep(200);
m_sReadSMS = SpSMS.ReadExisting();
///发短信:">"字符后面跟这将要发送的内容
if (m_sReadSMS.IndexOf(">") > 0)
{
...
}else
{
if (m_sReadSMS.IndexOf("002A") > 0) // 002A为收到内容的标识
{
try
{
MessageBox.Show(m_sReadSMS);//此处显示出来接收的内容不完整
///收短信
if (m_sReadSMS.IndexOf("+CMT") > 0)
{
...
}
...
}
}
}
}
serialPort1.BaudRate = int.Parse(comboBox2.Text);
serialPort1.Encoding = Encoding.ASCII;
serialPort1.RtsEnable = true;
serialPort1.Open();
另外,我发现你用的类似SpSMS.WriteLine("AT\r\n"); 这样写的数据,实际上要不WriteLine("AT");, 要不Write("AT\r"),不知道这个是否会有影响到你数据的接收。
你在委托里做了什么呢?
/// 接收到数据时触发该事件
/// </summary>
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
MethodInvoker miReceivedData = new MethodInvoker(InvokeReceivedData);
try
{
System.Threading.Thread.Sleep(200);
string data = this.serialPort1.ReadExisting();
//收到短信
if (data.IndexOf("CMTI", StringComparison.CurrentCultureIgnoreCase) > 0)
{
//该干嘛干嘛了。
看来需要调整一下程序结构。谢谢诸位朋友了。给分,呵呵。