关于SerialPort串口编程的问题

li006680 2009-04-04 12:53:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace online
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//向COM2接收数据
private void btnStart_Click(object sender, EventArgs e)
{
try
{
SerialPort spIncept = new SerialPort("COM2");
spIncept.Open();
string message = spIncept.ReadLine();
spIncept.Close();
MessageBox.Show(message);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

private void btnSend_Click(object sender, EventArgs e)
{
try
{
SerialPort spSend = new SerialPort("COM1");
spSend.Open();
spSend.Write("Fuck You!");
spSend.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}

我用的是C# Winform程序写的,上面这段代码运行到//向COM2接收数据时候就会假死哪个大哥帮我看看啊,如果还有其他的错误请帮我指明一下,谢谢各位大大了!!!
...全文
447 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xufzu123 2009-04-04
  • 打赏
  • 举报
回复
如果怕麻烦,可以下一个虚拟串口程序辅助调试
sytu_hzj 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 li006680 的回复:]
引用 7 楼 c123728529 的回复:
说了这么多也不知道说明白没有!因为现在缓冲区里面的值是你不知道的!所以你输出的时候会卡死!
好久没有用SerialPort了

那请问我先在把代码修改了以后如下:
SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Parity = 0; //奇偶校验
serialPort1.ReadTimeout = 1000; //读超时
serialPort1.Open();

[/Quote]


补充一下,如果是COM1发给COM1是收不到的,你可以用串口线将COM1和COM2连接起来,用COM1发,用COM2收,正常的话COM2会显示COM1发过来的字符串。前提是COM2可用
你可用串口调试工具做这个测试, 很简单
sytu_hzj 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sytu_hzj 的回复:]
楼主,电脑上的COM2一般是被系统占用的,你可以捕获一下异常,如果串口被占用,e.Message为“端口被关闭”
[/Quote]

之所以没有值,
1. 是因为你的串口还没有收到值,在接收之前加一句Thread.Sleep(100), 试试。
2. 更本没有返回值。不知道你是在和什么通信?下位机吗?如果是下位机,请确保协议正确
sytu_hzj 2009-04-04
  • 打赏
  • 举报
回复
楼主,电脑上的COM2一般是被系统占用的,你可以捕获一下异常,如果串口被占用,e.Message为“端口被关闭”
li006680 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 c123728529 的回复:]
说了这么多也不知道说明白没有!因为现在缓冲区里面的值是你不知道的!所以你输出的时候会卡死!
好久没有用SerialPort了
[/Quote]
那请问我先在把代码修改了以后如下:
SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Parity = 0; //奇偶校验
serialPort1.ReadTimeout = 1000; //读超时
serialPort1.Open();

string s = "test string";
byte[] source = new byte[100];
source = System.Text.Encoding.Unicode.GetBytes(s);

serialPort1.Write(source,0,source.Length);
MessageBox.Show("数据发送成功!" + "\r\n" + "数据:", "提示");

this.textBox1.Text = serialPort1.ReadExisting();
MessageBox.Show("数据接收成功!","系统提示");

这段程序能够成功运行但是文本框textBox1中没有任何值,请问这个是什么原因啊
高效匠人 2009-04-04
  • 打赏
  • 举报
回复
说了这么多也不知道说明白没有!因为现在缓冲区里面的值是你不知道的!所以你输出的时候会卡死!
好久没有用SerialPort了
高效匠人 2009-04-04
  • 打赏
  • 举报
回复
Readline();是一直读取输入缓冲区的值。在winfrom中没有给缓冲区输入值的界面!
高效匠人 2009-04-04
  • 打赏
  • 举报
回复
string message = spIncept.ReadLine();
winfrom里面可以这样子接收数据吗?
ReadLine();是控制台编程吧!换成控制台编程。或者你可以在winfrom窗体中加入一个textbox。接收输入信息试试!
li006680 2009-04-04
  • 打赏
  • 举报
回复
有没有大哥大姐知道啊
li006680 2009-04-04
  • 打赏
  • 举报
回复
真的有啊,我电脑上面有COM1和COM2端口的
春天的气息 2009-04-04
  • 打赏
  • 举报
回复
小心端口被占用哦。特别是端口号比较小的。

可以看看
http://bbs.bbs180.com/showtopic-366.aspx

上面有些介绍这方面的信息。
51Crack 2009-04-04
  • 打赏
  • 举报
回复
你确定你电脑有“COM2”?

111,126

社区成员

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

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

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