C#串口通信的问题,很急,望高人解答!

chen0683102 2010-09-25 06:46:34
我的电脑串口连了个modem,用VS2008建了个项目,两个textbox控件,一个Button空间,一个serialport控件,现在要和modem通信,代码如下:
serialPort.Open();
serialPort.WriteLine(textBox1.Text);
textBox2.Text = serialPort.ReadLine();
serialPort.Close();

问题是,每次发送atz\n或atz\r\n时,textbox2都显示atz,按道理应该是返回“OK”才对啊?急求解答。通信有没有成功呢???
...全文
211 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen0683102 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zyl_leilei 的回复:]

最好是加个延时再试试。以前我也遇到过用串口调试工具可以,
但是代码不行的问题,与延时有很大关系。
serialPort.Open();
Thread.Sleep(1000);
serialPort.WriteLine(textBox1.Text);
Thread……
[/Quote]
加了延时了,还是那样
dai78 2010-09-26
  • 打赏
  • 举报
回复
用接收事件接收数据,你那种方法如果发送数据间隔时间长,后面的数据就接收不到了
yuerjiajia 2010-09-26
  • 打赏
  • 举报
回复
发送命令 读取数据之间应该要有小延时 或者使用DataReceived事件
-小蕾- 2010-09-26
  • 打赏
  • 举报
回复
最好是加个延时再试试。以前我也遇到过用串口调试工具可以,
但是代码不行的问题,与延时有很大关系。
serialPort.Open();
Thread.Sleep(1000);
serialPort.WriteLine(textBox1.Text);
Thread.Sleep(1000);
textBox2.Text = serialPort.ReadLine();
Thread.Sleep(1000);
serialPort.Close();
再者你要注意,你的发送命令是什么格式的。比如,用串口调试工具如果是发送为16进制的,那么你的代码里面也要先将命令转换为16进制。
兔子-顾问 2010-09-26
  • 打赏
  • 举报
回复
你看看OK前面有几个回车换行?我记得AT命令经常是应答时候多几个回车换行的。你readline一次就读到空内容了。
chen0683102 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyazhe 的回复:]

用串口调试工具,手工发命令,把命令的收发流程弄清楚先。例如用sscomm32软件。你发送命令,看实际返回是什么。
[/Quote]
我发送“atz\n”实际返回的是“OK”啊
3000sunqin 2010-09-26
  • 打赏
  • 举报
回复
我估计是Modem上面的Echo设置被打开了
chen0683102 2010-09-26
  • 打赏
  • 举报
回复
我用serialPort.Read(,,)读取的,现在能读到“OK”了,但是发现个问题,
我发送“atz回车”,接到的是“atz回车OK”。正常情况是这样的吗?还是只应该接到“OK”啊?
scholar_fly 2010-09-26
  • 打赏
  • 举报
回复
大概是你的SerialPort的属性没选好,你看看例如DtrEnable=ture?等
兔子-顾问 2010-09-25
  • 打赏
  • 举报
回复
用串口调试工具,手工发命令,把命令的收发流程弄清楚先。例如用sscomm32软件。你发送命令,看实际返回是什么。
ttiimm11 2010-09-25
  • 打赏
  • 举报
回复
给LZ参考一下,以前项目上曾经用到过的读串口,我没用过serialport这个控件,都是自己写的class,还有就是LZ可以看一下在.ReadLine()加个短延时

private string Read(out char[] data)
{
string ret = string.Empty;
data = null;

try
{

bool bGet = false;
string received =string.Empty;
int nTimeout = 0;
do
{
received += m_Serial.ReadExisting();


if (received.IndexOf("\x00") >= 0)
{
int etx_pos = received.IndexOf("\x00");
if (etx_pos == received.Length - 3)
{
received = received.Substring(5, etx_pos-5);
data = getReceivedData(received);
bGet = true;
}
}

nTimeout++;

if (nTimeout > 100)
{
bGet = true;
}
}
while (!bGet);
}
catch
{

}

return ret;
}
chen0683102 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zanfeng 的回复:]
不是第一次返回的就是OK
好象是两次还是三次之后。具体看at 相关的指令。
[/Quote]
我用串口调试工具发送指令的,直接返回OK啊
足球中国 2010-09-25
  • 打赏
  • 举报
回复
不是第一次返回的就是OK
好象是两次还是三次之后。具体看at 相关的指令。
yuhuiwqvb 2010-09-25
  • 打赏
  • 举报
回复
不懂,帮顶一下!

110,539

社区成员

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

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

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