功能
通过C#将图片转化成数组并传输到MCU中
一、上位机
1. (主要介绍通信部分)
代码如下(示例):
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int reads = serialPort1.BytesToRead;
byte[] rdBuf = new byte[4096];
byte[] finishBytes = new byte[1];
finishBytes[0] = 0xa1;
int len = outBuffer.Length;
serialPort1.Read(rdBuf, 0, reads);
if (send_offset >= len)
{
serialPort1.Write(finishBytes, 0, 1);
MessageBox.Show("发送完毕");
}
else
{
if (reads >= 3)
{
if (rdBuf[0] == 0xa0)
send_picture(outBuffer, send_offset, 507);
Urat_tx_timer = 0;
}
}
}
private void button_com_open_Click(object sender, EventArgs e)
{
try
{
if (button_com_open.Text == "打开串口")
{
serialPort1.PortName = comboBox1.Text;
serialPort1.Open();
if (serialPort1.IsOpen)
{
button_com_open.Text = "关闭串口";
}
}
else
{
serialPort1.Close();
button_com_open.Text = "打开串口";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button_com_send_Click(object sender, EventArgs e)
{
TimerInit();
send_picture(outBuffer, 0, 507);
}
private void send_picture(byte[] Buf, int offset32, int length)
{
byte temp = 0;
if ((offset32 + length) > Buf.Length)
{
length = Buf.Length - offset32 + 7;
}
byte[] writeBytes = new byte[length];
writeBytes[0] = 0xa0;
writeBytes[1] = (byte)((length >> 8) & 0xff);
writeBytes[2] = (byte)(length & 0xff);
writeBytes[3] = (byte)((offset32 >> 16) & 0xff);
writeBytes[4] = (byte)((offset32 >> 8) & 0xff);
writeBytes[5] = (byte)(offset32 & 0xff);
Array.Copy(Buf, offset32, writeBytes, 6, length-7);
for (int j = 0; j < (length - 1) ; j++)
{
temp += writeBytes[j];
}
writeBytes[length-1] = temp;
serialPort1.Write(writeBytes, 0, length);
send_offset += (length-7);
Urat_tx_timer = 0;
}
private void TimerInit()
{
timer_1.Enabled = true;
timer_1.Interval = 1;//1毫秒
timer_1.Tick += new EventHandler(timer_Name_Tick);
timer_1.Start();
}
private void timer_Name_Tick(object sender, EventArgs e)
{
if (send_offset < outBuffer.Length)
{
//关闭定时器防止多次触发
timer_1.Enabled = false;
Urat_tx_timer++;
if (Urat_tx_timer >= 50)
{
send_offset -= 500;
send_picture(outBuffer, send_offset, 507);
}
//启动定时器
timer_1.Enabled = true;
}
}
二、从机接收部分
1.代码如下(示例):
while (1)
{
checkByte=0;
printf("wait command..... \n\n");
rlen = 0;
memset((void*)rbuf, 0x0, BUF_LEN);
rlen = read(ITP_DEVICE_USBDACM, rbuf, BUF_LEN);
//printBuf("rdbuf",rbuf,rlen);
if(rbuf[0]==0xa1)
break;
for(int j=0;j<rlen-1;j++)
{
checkByte+=rbuf[j];
}
if((rbuf[0]==0xa0)&&(checkByte==rbuf[rlen-1]))
{
size0 = (uint8_t)((rlen>>8)&0xff);
size1 = (uint8_t)(rlen&0xff);
if ((rbuf[1]==size0) &&(rbuf[2]==size1))
{
memcpy(&WriteBuf[get_offset],&rbuf[6],rlen-7);
//printBuf("WriteBuf",&WriteBuf[get_offset],rlen-7);
get_offset+=(rlen-7);
memcpy(buf,rbuf,6);
len = strlen(buf);
write(ITP_DEVICE_USBDACM, buf, len);
k++;
printf("\n K=%d\n", k);
}
//usleep(200*1000);
}
}