private void RX_thread()
{
int buffersize = _SerialPort.BytesToRead; //十六进制数的大小
byte[] buffer = new Byte[buffersize]; //创建缓冲区
_SerialPort.Read(buffer, 0, buffersize); //将数读到buffer里,来创建一个缓冲区;
if (RX_HEX_checkBox.Checked)
{
RXbox.AppendText(HEX_To_String(buffer)); //将数据放在一个textbox 里,进行显示;
}
else
{
try
{
//int itemp = int.Parse(HEX_To_ASCII(buffer));
//ltBuffer.Add();
RXbox.AppendText(HEX_To_ASCII(buffer));
//蛋疼的处理richtextbox
//richtextbox中\n \r两者都是换行
//if ((buffer[0] == 0x0A) && (flagRN)) { } else { flagRN = false; }
//if (buffer[buffer.Length - 1] == 0x0D) { flagRN = true; }
}
catch { }
}
//if (scroll_checkBox.Checked)
//{
// //RXbox.AutoScrollOffset
// //RXbox.view
// //RXbox_Scroll.Maximum = RXbox.ViewportHeight;
//}
RXL = RXL + buffer.Length;
toolStripStatusLabel_R.Text = RXL.ToString();
//MessageBox.Show(RXbox.Text);
//if(ltBuffer.Count == 641)
//{
// MessageBox.Show("1");
// if (ltBuffer[640] == "T")
// {
// ltBuffer.Clear();
// }
//}
//一下代码就是对位图进行一行行处理
// if (ltBuffer.Count == 640)
if (ltBuffer.Count > 640)
{
//draw
Bitmap b = new Bitmap(16, 40);
MemoryStream m = new MemoryStream(); //缓冲区?
//锁定位图
BitmapData bbb = b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr = bbb.Scan0; //找到位图首地址
byte[] byteData = new byte[b.Width * b.Height * 3];//存放位图
System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, b.Width * b.Height * 3); //给RGB赋值
//核心代码,循环处理位图
for (int i = 16 * 40 - 1; i >= 0; i--)
{
double dscal;
if (double.Parse(ltBuffer[16 * 40 - 1 - i]) > 145)
{
Console.WriteLine("I de 值:" + i+" "+ltBuffer);
dscal = 1;
}
else
{
if (double.Parse(ltBuffer[16 * 40 - 1 - i]) < 16)
{
dscal = 0;
}
else
{
dscal = (double.Parse(ltBuffer[16 * 40 - 1 - i]) - 16) / 255.0;
}
}
if (dscal > 1)
{
dscal = 1;
}
byteData[i * 3 + 0] = (byte)(255 * dscal);//B
byteData[i * 3 + 1] = (byte)(255 * dscal);//G
byteData[i * 3 + 2] = (byte)(255 * dscal);//R
}
// if (ltBuffer.Count == 689)
//
// if (ltBuffer.Count > 688)
// {
// //draw
// Bitmap b = new Bitmap(16, 43);
// MemoryStream m = new MemoryStream(); //缓冲区?
// //锁定位图
// BitmapData bbb = b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
// IntPtr ptr = bbb.Scan0; //找到位图首地址
// byte[] byteData = new byte[b.Width * b.Height * 3];//存放位图
// System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, b.Width * b.Height*3); //给RGB赋值
// //核心代码,循环处理位图
// for (int i = b.Width*b.Height - 1; i >= 0; i--)
// {
// double dscal;
// if (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) > 156)//修改一处:
// {
// dscal = 1;
// }
// else
// {
// if (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) < 17)
// {
// dscal = 0;
// }
// else
// {
// dscal = (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) - 17) / 255.0;
// }
// }
//
// if (dscal > 1)
// {
// dscal = 1;
// }
//
// byteData[i * 3 + 0] = (byte)(255-255 * dscal);//B
// byteData[i * 3 + 1] = (byte)(255-255 * dscal);//G
// byteData[i * 3 + 2] = (byte)(255-255 * dscal);//R
// }
//放回位图
System.Runtime.InteropServices.Marshal.Copy(byteData, 0, ptr, b.Width * b.Height * 3);
//释放位图
b.UnlockBits(bbb);
//保存位图
b.Save(m, ImageFormat.Bmp);
//以下代码,进行位图的显示操作
Image bba = Image.FromStream(m);
ImageAttributes im = new ImageAttributes();
Graphics g = Graphics.FromImage(bba);
this.pictureBox1.Image = bba;
g.DrawImage(bba, new Point(20, 20));
ltBuffer.Clear();
}
else if(ltBuffer.Count > 640)// // if(ltBuffer.Count > 688)
{
// MessageBox.Show(ltBuffer.Count.ToString());
ltBuffer.Clear();
}
}
这个要看你的下位机的通讯协议,ltBuffer这个的格式是什么,按什么规则传输,先单独把这部分调试好了,再转换位图。