为什么我的串口接收不到数据

mohugomohu 2010-11-02 09:31:15
            SerialPort sp = new SerialPort("COM1", 9600);
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();
string strCmd = "AT+CSMP=21,167,0,8\r";
sp.Write(strCmd);
Thread.Sleep(100);
strCmd = "AT+CMMS=3\r";
sp.Write(strCmd);
Thread.Sleep(100);
strCmd = "AT+CMGF=1\r";
sp.Write(strCmd);
Thread.Sleep(100);
strCmd = "AT+CMGS=13426023512\r";
sp.Write(strCmd);
Thread.Sleep(100);
strCmd = EncodingUCS2("随便") + "\x1A";
sp.Write(strCmd);
Thread.Sleep(10000);

string result = String.Empty;
int size = sp.BytesToRead;
byte[] buffer = new byte[size];
int count = sp.Read(buffer, 0, buffer.Length);
result = Encoding.UTF8.GetString(buffer, 0, count).Replace("\0", "");

sp.Close();


int size = sp.BytesToRead;一直是0!
...全文
325 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
果然是因为注册了DataReceived事件。
兔子-顾问 2010-11-02
  • 打赏
  • 举报
回复
try
{
注销事件
你顶上那一段代码,
}
finally
{
重新注册事件
}
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]

你注册了DataReceived事件?那你这等的时候有没有先注销DataReceived?不注销的话,你等的这10秒时间,DataReceived事件中就先吧数据读走了。你当然没数据?
[/Quote]
不知道是不是因为这个,但是这个有点问题啊,如果注销了这个事件,那我接收短信可怎么办啊
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
用超级终端是显示正常的
兔子-顾问 2010-11-02
  • 打赏
  • 举报
回复
你注册了DataReceived事件?那你这等的时候有没有先注销DataReceived?不注销的话,你等的这10秒时间,DataReceived事件中就先吧数据读走了。你当然没数据?
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
我被这问题搞死了,read试过了,readexisting试过了,就是收不到返回值!但是接收短信是可以的
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]

strCmd = EncodingUCS2("随便") + "\x1A";
sp.Write(strCmd);
1A是什么
试试这下面再加一句
sp.Write("\r\n");
[/Quote]
发送短信是用ctrl+z,不是回车
mohugomohu 2010-11-02
  • 打赏
  • 举报
回复
        private static void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
lock (_lock)
{
Thread.Sleep(1000);
SerialPort sp = (SerialPort)sender;
if (sp.IsOpen)
{
string result = String.Empty;
byte[] buffer = new byte[128];
int count = sp.Read(buffer, 0, buffer.Length);
result = Encoding.UTF8.GetString(buffer, 0, count);
if (result.ToUpper().IndexOf("+CMTI") != -1)//这是收到短信
{
result = result.Replace("\r", "").Replace("\n", "");
string index = result.Substring(result.IndexOf(",") + 1);
sp.Write("at+cmgr=" + index + "\r");
Thread.Sleep(1000);
int size = sp.BytesToRead;
byte[] b2 = new byte[size];
count = sp.Read(b2, 0, b2.Length);
result = Encoding.UTF8.GetString(b2, 0, count);
string ucs2Text = result.Substring(result.LastIndexOf("\"") + 1);
if ((ucs2Text.IndexOf("ERROR") == -1 && ucs2Text.IndexOf("OK") != -1))
{
string text = ucs2Text.Replace("OK\r\n", "").Replace("\r", "").Replace("\n", "");
Console.Write("收到短信:" + DecodingUCS2(text) + Environment.NewLine);
sp.Write("at+cmgd=" + index + "\r");
Thread.Sleep(100);
}
}
}
}
}


接收短信的能收到
兔子-顾问 2010-11-02
  • 打赏
  • 举报
回复
strCmd = EncodingUCS2("随便") + "\x1A";
sp.Write(strCmd);
1A是什么
试试这下面再加一句
sp.Write("\r\n");
HaveOneDream 2010-11-02
  • 打赏
  • 举报
回复
1.在sp_DataReceived设断点监听
2.串口是否有发送数据出来?
3.检查所接的串口是否是COM1?

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧