c#: COM端口,GSM设备只是发送回我发给他的东西
本文关键字:端口 COM GSM | 更新日期: 2023-09-27 18:06:13
我正在尝试用连接到COM端口的GSM调制解调器发送和接收数据。下面是我的代码的关键部分:
SerialPort sp = new SerialPort();
sp.PortName = "COM1";
sp.BaudRate = 9600;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.ReadTimeout = 5000;
sp.Open();
if (sp.IsOpen)
{
Console.WriteLine(sp.PortName + " is open");
Console.WriteLine("Trying to write data");
sp.Write("AT");
Console.WriteLine("Data has been sent");
Console.WriteLine("Trying to read data");
char[] read = new char[200];
sp.Read(read, 0, 20);
foreach (char chr in read)
{
Console.Write(chr);
}
Console.WriteLine();
}
我没有得到任何错误,但是GSM设备只是把我发送给他的东西发回给我。在这个例子中是AT。如果我发送"BOO",他会发送回"BOO"(虽然有时我只收到第一个字母,我认为这是因为我读取数据的方式,应该在一个单独的线程中不是吗?我以后可以很容易地做到这一点)。
当我给他发"AT"时,我希望他给我回"OK"。
设备把我发给他的东西传回来,这有什么解释呢?我在想可能是端口通信没有正确设置,我实际上没有到达设备,只是把它发回给我自己?
是否使用PuTTY与之通信?您应该首先尝试从终端应用程序(PuTTY下载链接)发送和接收数据,以排除调制解调器本身的任何问题,然后继续编写应用程序进行通信。
对于代码,您应该使用sp.WriteLine而不是sp.Write…调制解调器需要看到换行符才能知道命令已经完成。可以使用sp.NewLine设置换行符,使其与调制解调器需要看到的内容匹配。或者,您可以将''r'附加到您正在编写的任何AT命令后。
我使用过的GSM调制解调器默认都有echo,你可以通过发送'ATE0'来禁用echo。当echo打开时,调制解调器将首先响应您发送给它的任何内容,然后它将发送它的响应。由于你读取数据的方式,我怀疑你看到的是回声,而不是响应。尝试以下方法读取数据:
//add this just before opening the port
sp.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
在设置端口的方法之外添加以下方法:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Console.WriteLine(port.ReadExisting());
}