---begind
/****************这是数据类************/
private byte[] testw;//写
public byte[] testr;//读
//发送数据
public short SetParameter(byte addr, byte value, byte ReaderAddr)
{
short result = -1;
try
{
this.testw = new byte[8];
this.testw[0] = 0xAA;
this.testw[1] = ReaderAddr;
this.testw[2] = 5;
this.testw[3] = CMD.PID_GET_PARAMETER;
this.testw[5] = addr;
this.testw[6] = value;
this.testw[this.testw.Length - 1] = this.Last(this.testw);
this.spt.Write(this.testw, 0, this.testw.Length);//串口自身的方法发送数据
result = 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return result;
} //由 DataReceived 事件接收数据
private void spt_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
this.spt.BaseStream.Flush();
int j = this.spt.BytesToRead;
testr = new byte[j];
this.spt.Read(testr, 0, j);//把数据读入数组中
this.spt.BaseStream.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.spt.BaseStream.Close();
}
}
/****************这是测试类************/
byte[] test;
//把上面的数据类创建对象,下面调用方法
UserControl1 uc = new UserControl1();
private void button2_Click(object sender, EventArgs e)
{
try
{
short k = 0;
k = uc.DrfCommOpen("COM1"); //这是打开串口的方法,已经成功
if (k == 0)
{
k = uc.SetParameter(0xC1, 20, 0xFF);//这个是问题的所在
if (k == 0)
{
test = testr; //把数据类的数组传给本类的数组
this.label2.Text = "";
foreach (byte rr in test)
{
this.label2.Text += rr.ToString() + " ";
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
---end前提,所有硬件都正常连接并工作。
可是有一个很奇怪的问题,串口监测工具(如AccessPort、串口调试助手等)明明显示有数据返回,也就是说数据类的testr数组已经存有数据了,可是测试类的test数组接收的东西却不相符,具体情况是这样的,第1次点击按钮时,引发异常数组超出下标,第2次点击按钮才读到正确的东西,也就是说要点击2次按钮才能得到数据,这样的现象不正常。请问高手该如何解决此问题,第一次接触串口的开发,请诸位多指教。
/****************这是数据类************/
private byte[] testw;//写
public byte[] testr;//读
//发送数据
public short SetParameter(byte addr, byte value, byte ReaderAddr)
{
short result = -1;
try
{
this.testw = new byte[8];
this.testw[0] = 0xAA;
this.testw[1] = ReaderAddr;
this.testw[2] = 5;
this.testw[3] = CMD.PID_GET_PARAMETER;
this.testw[5] = addr;
this.testw[6] = value;
this.testw[this.testw.Length - 1] = this.Last(this.testw);
this.spt.Write(this.testw, 0, this.testw.Length);//串口自身的方法发送数据
result = 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return result;
} //由 DataReceived 事件接收数据
private void spt_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
this.spt.BaseStream.Flush();
int j = this.spt.BytesToRead;
testr = new byte[j];
this.spt.Read(testr, 0, j);//把数据读入数组中
this.spt.BaseStream.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.spt.BaseStream.Close();
}
}
/****************这是测试类************/
byte[] test;
//把上面的数据类创建对象,下面调用方法
UserControl1 uc = new UserControl1();
private void button2_Click(object sender, EventArgs e)
{
try
{
short k = 0;
k = uc.DrfCommOpen("COM1"); //这是打开串口的方法,已经成功
if (k == 0)
{
k = uc.SetParameter(0xC1, 20, 0xFF);//这个是问题的所在
if (k == 0)
{
test = testr; //把数据类的数组传给本类的数组
this.label2.Text = "";
foreach (byte rr in test)
{
this.label2.Text += rr.ToString() + " ";
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
---end前提,所有硬件都正常连接并工作。
可是有一个很奇怪的问题,串口监测工具(如AccessPort、串口调试助手等)明明显示有数据返回,也就是说数据类的testr数组已经存有数据了,可是测试类的test数组接收的东西却不相符,具体情况是这样的,第1次点击按钮时,引发异常数组超出下标,第2次点击按钮才读到正确的东西,也就是说要点击2次按钮才能得到数据,这样的现象不正常。请问高手该如何解决此问题,第一次接触串口的开发,请诸位多指教。
解决方案 »
- WPF中遍历Textbox中内容
- TcpClient client = new TcpClient("127.0.0.1", 8888);怎么释放
- c# Form与Form之间参数的传递
- 求助!.net 2005 openfiledialog的问题
- C#中类型库怎么注册,我是新手希望大家不吝赐教
- 求一简单sql
- VS不能运行
- 如何获取treeView下节点的级别
- 在WinFrom的TextBox控件输入汉字的时候内存猛增!
- email的正则表达式求解???
- Repeater里怎么动态绑定数据和修改数据(急,新人找高手帮忙)
- C#做的组件(.dll),asp里怎么调用?很简单的测试代码都出错了,请帮忙看看
this.serialPort1.DiscardOutBuffer();
我加了这些也不行啊
可以这样:
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;
serialPort1.Encoding = Encoding.ASCII; //编码,收与发的编码方式应该相同.要发送汉字,用UTF-8,Unicode都可以.
if (serialPort1.IsOpen)
{
serialPort1.Close();
serialPort1.Open();
}
else
serialPort1.Open();
这打开了.
就可以发了,你是用C#写的,其实不用那么麻烦的.当然我只是说个人意见,请你多多包含:可以这样发送:(声明我只是拿部分代码,有些变量没定义,请自己定义!)
serialPort1.Write("work");//发送字符串.
serialPort1.Write(Data, 0, Data.Length);//发送字节数组.
serialPort1.WriteLine("work"); // 发送一行数据.
上面两种随便选.
读取数据:一般我个人理解,用一次读一个字节,这样可以有更好的准确性:
byte[] data = new byte[serialPort1.BytesToRead];
//serialPort1.BytesToRead --串口缓冲区中可读字节的大小.
for (int i = 0; i < data.Length; i++)
{
data[i] = Convert.ToByte(serialPort1.ReadByte());
//用字节收,要考虑编码的问题.在设置中我已提了.
String tempStr=Encoding.ASCII.GetString(data);
//得到临时的数据.由于串口通信时,不是一次发送全部数据,而是八字节八字节的发,至于为什么,我只是调试出来的.所以,在你的应用程序类中定义一个成员变量 string sData;
sData+=tempStr;
}
string GetData()
{
return sData;//这才是收到的完整数据.
}把个人意见与想法拿出来,给你参考一下,希望对你有用.