51单片机与上位机通信,使用C#语言

zym19825 2012-09-22 08:29:04
我用c#编写了一个小程序,想让它与单片机通信,并把单片机键盘扫描的键值通过串口传给上位机,发1时led1灯亮,发0时灯灭,但是我发出去1时灯没有反应,也接受不到键值;当我把串口的2,3脚相连是,发送数据又可以接到,这是为什么呀?那位朋友可以指点一下,这是代码
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
string[] portname = SerialPort.GetPortNames();
foreach (string port in portname)
{
CuankoucomboBox.Items.Add(port);
i++;
}

if (i > 0)
{
CuankoucomboBox.SelectedIndex = 0;
}
BotecomboBox.SelectedIndex = BotecomboBox.Items.IndexOf("9600");//波特率设为9600
Openbutton.Text = "打开串口";
sendbutton.Enabled = false;
serialPort1.Close();




}

private void Openbutton_Click(object sender, EventArgs e)
{
if (Openbutton.Text == "打开串口")
{
try
{
Openbutton.Text = "关闭串口";
sendbutton.Enabled = true;
serialPort1.PortName = CuankoucomboBox.SelectedItem.ToString();
serialPort1.BaudRate = Convert.ToInt32(BotecomboBox.SelectedItem);//设置波特率和把串口名字赋给serailport控件
serialPort1.DataBits = 8;//传输数据的长度
serialPort1.StopBits = StopBits.One;//使用停止位为1位
serialPort1.Parity = Parity.None;//不使用奇偶校验位
serialPort1.Open();//打开串口
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();//释放缓冲区的数据
}
catch(System.IO.IOException)
{
MessageBox.Show("串口不存在,请选择正确串口");
Openbutton.Text = "打开串口";

}


}
else if(Openbutton.Text=="关闭串口")
{
try
{
Openbutton.Text = "打开串口";
sendbutton.Enabled = false;
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();//释放缓冲区的数据
serialPort1.Close();
}
catch (System.InvalidOperationException)
{

Openbutton.Text = "打开串口";
serialPort1.Close();
}

}
}
Int32 receivelength;
private void sendbutton_Click(object sender, EventArgs e)
{


byte[] data = Encoding.Unicode.GetBytes(sendtextBox.Text);
serialPort1.Encoding = System.Text.Encoding.GetEncoding("GB2312");//如果发中文必须有这一句
receivelength = 0;
serialPort1.Write(sendtextBox.Text);//发送数据

serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);//注册DataReceived事件



}

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//DataReceived委托事件
{
// throw new NotImplementedException();
this.Invoke((EventHandler)(delegate
{
receivelength += serialPort1.ReadBufferSize;
byte []buff=new byte[receivelength];
serialPort1.Read(buff,0,receivelength);
string str = Encoding.Default.GetString(buff);//把buf数组转换成字符串类型
//string str = Convert.ToString(buff);
ReceivedtextBox.AppendText(str);
if (receivelength != 0)
{
serialPort1.DataReceived -= new SerialDataReceivedEventHandler(serialPort1_DataReceived);

}
}));
}

private void button1_Click(object sender, EventArgs e)
{
sendtextBox.Text = "";
}

private void button2_Click(object sender, EventArgs e)
{
ReceivedtextBox.Text = "";
}
}
}
...全文
759 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
枯黄的树叶 2012-12-01
  • 打赏
  • 举报
回复
0x01 自己换
keith_cheung 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

怎样才能发送二进制的1给串口(不是字符1)
[/Quote]

好象只能发十六进制与一般字符。
sourire24 2012-09-25
  • 打赏
  • 举报
回复
累不累啊
zym19825 2012-09-25
  • 打赏
  • 举报
回复
怎样才能发送二进制的1给串口(不是字符1)
youzi722 2012-09-23
  • 打赏
  • 举报
回复
选上串口调试助手的16进制, 名称或许叫hex那个复选框,然后直接输入00 01 02 03 04 0a 0b类似的序列,就是16进制了,否则如果不选,实际是ASCII字符串。
zym19825 2012-09-23
  • 打赏
  • 举报
回复
哦,天啊!我刚测过了,你的方法好棒啊,太谢谢你了,可是我发的明明是1为什么串口助手接受的是1的ACS11值,接收通过串口助手发送过来的也是奇怪的符号,怎样转换啊
youzi722 2012-09-22
  • 打赏
  • 举报
回复
这个可能的原因有很多啊,测一下不就可以了么

用你的电脑的串口连另一台电脑的串口(如果你的电脑上有两个串口,互联也行),开个串口调试助手,用你的软件发一下,看调试助手能收到不,在用串口调试助手发一下,看你的软件能收到不,这样,先吧你的软件调好。

然后用串口调试助手连单片机,看串口调试助手和单片机串口通信正常不,直到调正常了。

最后再用你的软件连单片机,不就没问题了么。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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