串口调试助手源代码.docx
《串口调试助手源代码.docx》由会员分享,可在线阅读,更多相关《串口调试助手源代码.docx(17页珍藏版)》请在冰豆网上搜索。
串口调试助手源代码
串口调试助手预源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.IO.Ports;
usingSystem.Threading;
usingDevExpress.XtraEditors;
usingSystem.Text.RegularExpressions;
namespaceWindowsFormsApplication3
{
publicpartialclassForm1:
XtraForm
{
SerialPortsp1=newSerialPort();
intFlag=0;
intStateChanged=0;
intStateChanged_Ascii=1;
intStateChanged_16=0;
stringTemp=null;
stringTemp_memoSend=null;
privatevoidmemoSend_EditValueChanged(objectsender,EventArgse)
{
}
publicForm1()
{
InitializeComponent();
sp1.DataReceived+=sp1_DataReceived;
}
privatevoidForm1_Load(objectsender,EventArgse)
{
this.MaximizeBox=false;
//检查是否有串口
string[]str=SerialPort.GetPortNames();
if(str==null)
{
MessageBox.Show("本机没有串口!
","error");
return;
}
//添加串口项目
foreach(stringportinSystem.IO.Ports.SerialPort.GetPortNames())
{
cbSerial.Properties.Items.Add(port);
}
//串口设置默认选择项
cbSerial.SelectedIndex=0;
Control.CheckForIllegalCrossThreadCalls=false;
sp1.DataReceived+=newSerialDataReceivedEventHandler(sp1_DataReceived);//订阅委托
}
privatevoidcomboBoxEdit1_SelectedIndexChanged(objectsender,EventArgse)
{
}
privatevoidOpenSerial_Click(objectsender,EventArgse)
{
sp1.Close();
//SerialPortsp1=newSerialPort();
if(!
sp1.IsOpen)//串口是关闭的,设置参数,打开串口
{
try
{
//获取串口号
stringserialName=cbSerial.SelectedItem.ToString();
sp1.PortName=serialName;
//设置各参数
stringstrBaudRate=cbBaudRate.Text;
stringstrDateBits=cbDataBits.Text;
stringstrStopBits=cbStop.Text;
sp1.BaudRate=Convert.ToInt32(strBaudRate);//波特率
sp1.DataBits=Convert.ToInt32(strDateBits);//数据位
switch(cbStop.Text)//停止位
{
case"1":
sp1.StopBits=StopBits.One;
break;
case"1.5":
sp1.StopBits=StopBits.One;
break;
case"2":
sp1.StopBits=StopBits.Two;
break;
default:
MessageBox.Show("Error:
参数不正确!
","Error");
break;
}
switch(cbParity.Text)//校验位
{
case"无":
sp1.Parity=Parity.None;
break;
case"奇校验":
sp1.Parity=Parity.Odd;
break;
case"偶校验":
sp1.Parity=Parity.Even;
break;
default:
MessageBox.Show("Error:
参数不正确!
","Error");
break;
}
if(sp1.IsOpen==true)
{
sp1.Close();
}
sp1.Open();
//btnOpen.Enabled=false;
labSerial.Text="串口号:
"+sp1.PortName;
labState.Text="状态:
打开";
}
catch(System.Exceptionex)
{
MessageBox.Show("Error:
"+ex.Message,"Error");
return;
}
}
}
//privatevoidCloseSerial_Click(objectsender,EventArgse)
//{
//if(sp1.IsOpen)
//{
//sp1.Close();
//labSerial.Text="串口号:
"+sp1.PortName;
//labState.Text="状态:
关闭";
//}
//}
privatevoidSend_Click(objectsender,EventArgse)
{
stringStrSend=memoSend.Text;
if(!
sp1.IsOpen)
{
MessageBox.Show("请先打开串口!
","Error");
return;
}
else
{
if(rbtnSendStr.Checked)//字符串发送
{
if(ckTimeSend.Checked&&!
(string.IsNullOrEmpty(textTime.Text)))//判断是否定时发送数据
{
stringTime=textTime.Text;
tmSend.Interval=int.Parse(Time)*1000;//时间单位是秒,化成毫秒单位
tmSend.Start();//开启定时器
}
else
{
sp1.Write(StrSend);//写入数据
}
}
else//十六进制发送
{
if(ckTimeSend.Checked&&!
(string.IsNullOrEmpty(textTime.Text)))
{
stringTime=textTime.Text;
tmSend.Interval=int.Parse(Time)*1000;
tmSend.Start();
}
else
{
stringStrSend_1=StrSend.Trim();//去掉前后的空格
//stringStrSend_2=StrSend_1.Replace("","");
//stringStrSend_3=string.Join("",Regex.Matches(StrSend_2,@"..|.").Cast().ToList());
string[]StrArray=StrSend_1.Split('');//用空格符隔开字符串数组
varStr_Send=newList();
//intbyteBufferLength=StrArray.Length;//数组StrArray的长度
for(inti=0;i{
if(StrArray[i].Trim()=="")
{
//byteBufferLength--;
continue;
}
else
{
if(StrArray[i].Length<3)
{
Str_Send.Add(StrArray[i]);
}
else
{
Str_Send.AddRange(Devide(StrArray[i]));
}
}
}
intbyteBufferLength=Str_Send.Count;
byte[]byteBuffer=newbyte[byteBufferLength];
intii=0;
for(inti=0;i{
//Byte[]bytesOfStr=Encoding.Default.GetBytes(StrArray[i]);
intdecNum=0;
//if(StrArray[i]=="")
//{
//continue;
//}
//else
//{
//decNum=Convert.ToInt32(Str_Send[i],16);//把字符串转成16进制数
//byteBuffer[ii]=Convert.ToByte(decNum);
//}
try
{
decNum=Convert.ToInt32(Str_Send[i],16);//把字符串转成16进制数
byteBuffer[ii]=Convert.ToByte(decNum);
}
catch(System.Exceptionex)
{
MessageBox.Show("输入错误!
","提示");
return;
}
ii++;
}
sp1.Write(byteBuffer,0,byteBuffer.Length);//从第0个开始写入byteBuffer,长度bytebuffer的长度。
}
}
}
}
privateListDevide(stringstr)
{
varret=Regex.Matches(str,@"..|.").Cast().ToList().ConvertAll(s=>s.Value.ToString());
returnret;
}
privatevoidtmSend_Tick(objectsender,EventArgse)
{
stringStrSend=memoSend.Text;
if(rbtnSendStr.Checked)
{
sp1.Write(StrSend);
}
else
{
stringStrSend_1=StrSend.Trim();//去掉前后的空格
string[]StrArray=StrSend_1.Split('');//用空格符隔开字符串数组
varStr_Send=newList();
for(inti=0;i{
if(StrArray[i].Trim()=="")
{
continue;
}
else
{
if(StrArray[i].Length<3)
{
Str_Send.Add(StrArray[i]);
}
else
{
Str_Send.AddRange(Devide(StrArray[i]));
}
}
}
intbyteBufferLength=Str_Send.Count;
byte[]byteBuffer=newbyte[byteBufferLength];
intii=0;
for(inti=0;i{
intdecNum=0;
try
{
decNum=Convert.ToInt32(Str_Send[i],16);//把字符串转成16进制数
byteBuffer[ii]=Convert.ToByte(decNum);
}
catch(System.Exceptionex)
{
MessageBox.Show("输入错误!
","提示");
return;
}
ii++;
}
sp1.Write(byteBuffer,0,byteBuffer.Length);//从第0个开始写入byteBuffer,长度bytebuffer的长度。
}
}
voidsp1_DataReceived(objectsender,SerialDataReceivedEventArgse)
{
byte[]byteRead=newbyte[sp1.BytesToRead];
if(rbtnRceStr.Checked)
{
memoRcv.Text+=sp1.ReadExisting();
memoRcv.SelectionStart=memoRcv.Text.Length;
memoRcv.ScrollToCaret();
}
else
{
if(rbtnRce16.Checked)
{
Byte[]receivedData=newByte[sp1.BytesToRead];//创建接收字节数组
sp1.Read(receivedData,0,receivedData.Length);
stringstrRcv=null;
for(inti=0;i{
strRcv+=receivedData[i].ToString("X2");
}
memoRcv.Text+=strRcv;
memoRcv.SelectionStart=memoRcv.Text.Length;
memoRcv.ScrollToCaret();
}
}
}
privatevoidStop_Click(objectsender,EventArgse)//退出接收数据
{
tmSend.Stop();
}
privatevoidClear_Click(objectsender,EventArgse)//清空接收数据
{
memoRcv.Text="";
}
privatevoidTime_Press(objectsender,KeyPressEventArgse)
{
if(!
Char.IsLetterOrDigit(e.KeyChar))
{
e.Handled=true;
}
else
{
e.Handled=false;
}
}
privatevoidTextTime_KeyPress(objectsender,KeyPressEventArgse)//限制定时发送时间只能输入数字
{
if(!
(Char.IsNumber(e.KeyChar))&&e.KeyChar!
=(char)8)
{
MessageBox.Show("请输入数字","提示");
e.Handled=true;
}
else
{
e.Handled=false;
}
}
privatevoidmemoSend_KeyPress(objectsender,KeyPressEventArgse)
{
}
privatevoidbtnClose_Click(objectsender,EventArgse)//关闭串口
{
if(sp1.IsOpen)
{
sp1.Close();
labSerial.Text="串口号:
"+sp1.PortName;
labState.Text="状态:
关闭";
}
}
privatevoidSend16_KeyPress(objectsender,KeyPressEventArgse)
{
//stringSend16=memoRcv.Text;
//byte[]buff=newbyte[Send16.Length/2];
//intindex=0;
//for(inti=0;i//{
//buff[index]=Convert.ToByte(Send16.Substring(i,2),16);
//++index;
//}
//stringresult=Encoding.Default.GetString(buff);
////MessageBox.Show(result);
//memoRcv.Text=result;
}
privatevoidSendStr_KeyPress(objectsender,KeyPressEventArgse)
{
//stringSendStr=memoRcv.Text;
//byte[]ba=System.Text.ASCIIEncoding.Default.GetBytes(SendStr);
//StringBuildersb=newStringBuilder();
//foreach(bytebinba)
//{
//sb.Append(b.ToString("x"));
//}
////MessageBox.Show(sb.ToString());
//memoRcv.Text=sb.ToString();
}
privatevoidrbtnSend16_CheckedChanged(objectsender,EventArgse)
{
StateChanged_16=1;
StateChanged_Ascii=0;
stringStrSend=memoSend.Text;
if(Temp_memoSend==StrSend.Trim()&&Flag==1)
{
memoSend.Text=Temp;
Flag=0;
}
else
{
memoSend.Text="";
foreach(charSinStrSend)
{
memoSend.Text+=((byte)S).ToString("X2");
}
}
}
privatevoidrbtnSendStr_CheckedChanged(objectsender,EventArgse)
{
if(StateChanged_16==1)
{
Flag=1;
}
StateChanged_16=0;
StateChanged_Ascii=1;
stringStrSend=memoSend.Text;
Temp=memoSend.Text;
stringStrSend_1=StrSend.Trim();//去掉前后的空格
string[]StrArray=StrSend_1.Split('');//用空格符隔开字符串数组
varStr_Send=newList();
for(inti=0;i{
if(StrArray.Length==0)
{
break;
}
else
{
if(StrArray[i].Trim()=="")
{
continue;
}
else
{
if(StrArray[i].Length<3)
{
Str_Send.Add(StrArray[i]);
}
else
{
Str_Send.AddRange(Devide(StrArray[i]));
}
}
}
intbyteBufferLength=Str_Send.Count;
byte[]byteBuffer=newbyte[byteBufferLength];
intii=0;
for(intj=0;j{
intdecNum=0;
try
{
decNum=Convert.ToInt32(Str_Send[j],16);//把字符串转成16进制数
if(decNum>=48&&decNum<=57||decNum>=65&&decNum<=90||decNum>=97&&decNum<=122)//除了数字和字母,其他都转成问号
{
byteBuffer[ii]=Convert.ToByte(decNum);
}
else
{
byteBuffer[ii]=Convert.To