CH341_I2C IIC调试助手源码

By admin at 3 天前 • 0人收藏 • 33人看过

有个项目用到了CH341A的IIC读写功能,直接和iic接口的设备通信

用到了[数据流函数] 可以一次多数据写入,

, 网上找了些资料和软件, 下面是源码

如果对iic不熟悉的可能会踩坑, 特此记录下:

  1. iic从机地址需要左移一位, 比如大多数设备是:0x50 , 那么函数参数的地址就需要0x50<<1 , 即为 0xA0 才行

  2. 通信的波特率不要设置太大, 虽然ch341支持400K和750K , 但是建议还是用20K或者100K的, 要不然数据可能会失真

  3.  CH341StreamI2C 函数是读写函数, 都用它,  写入的话,  地址就是A0 ,  读取需要在A0地址的最后位变更为1, 变成A1 , 这才代表读取.


image.png


using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace CH341T_I2C
{
	// Token: 0x02000003 RID: 3
	public partial class CH341_I2C : Form
	{
		// Token: 0x06000001 RID: 1
		[DllImport("CH341DLL.DLL")]
		public static extern int CH341OpenDevice(int iIndex);

		// Token: 0x06000002 RID: 2
		[DllImport("CH341DLL.DLL")]
		public static extern bool CH341ResetDevice(int iIndex);

		// Token: 0x06000003 RID: 3
		[DllImport("CH341DLL.DLL")]
		public static extern bool CH341SetDelaymS(int iIndex, int iDelay);

		// Token: 0x06000004 RID: 4
		[DllImport("CH341DLL.DLL")]
		public unsafe static extern bool CH341ReadI2C(int iIndex, byte iDevice, byte iAddr, byte* oByte);

		// Token: 0x06000005 RID: 5
		[DllImport("CH341DLL.DLL")]
		public static extern bool CH341WriteI2C(int iIndex, byte iDevice, byte iAddr, byte oByte);

		// Token: 0x06000006 RID: 6
		[DllImport("CH341DLL.DLL")]
		public unsafe static extern bool CH341StreamI2C(int iIndex, int iWriteLength, byte* iWriteBuffer, int iReadLength, byte* oReadBuffer);

		// Token: 0x06000007 RID: 7
		[DllImport("CH341DLL.DLL")]
		public static extern bool CH341SetStream(int iIndex, int iMode);

		// Token: 0x06000008 RID: 8 RVA: 0x00002050 File Offset: 0x00000250
		public CH341_I2C()
		{
			this.InitializeComponent();
			Control.CheckForIllegalCrossThreadCalls = false;
		}

		// Token: 0x06000009 RID: 9 RVA: 0x0000206C File Offset: 0x0000026C
		public void Connect_check_Handler()
		{
			for (;;)
			{
				Thread.Sleep(500);
				if (CH341_I2C.CH341OpenDevice(this.CH341_driver_num) == -1)
				{
					CH341_I2C.CH341ResetDevice(0);
					if (CH341_I2C.CH341OpenDevice(this.CH341_driver_num) == -1)
					{
						this.connect_Box.ForeColor = Color.Red;
						this.connect_Box.Text = "未连接";
					}
					else
					{
						this.connect_Box.ForeColor = Color.Blue;
						this.connect_Box.Text = "已连接";
					}
				}
				else
				{
					this.connect_Box.ForeColor = Color.Blue;
					this.connect_Box.Text = "已连接";
				}
			}
		}

		// Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310
		public void monitor_Handler()
		{
			for (;;)
			{
				if (this.read_data_str.do_ch341streami2c_mark)
				{
					this.read_data_str.do_ch341streami2c_time = this.read_data_str.do_ch341streami2c_time + 1;
					if (this.read_data_str.do_ch341streami2c_time >= this.do_ch341streami2c_overtime)
					{
						CH341_I2C.CH341ResetDevice(this.read_data_str.iIndex);
						this.read_data_str.do_ch341streami2c_time = 0;
					}
				}
				Thread.Sleep(10);
			}
		}

		// Token: 0x0600000B RID: 11 RVA: 0x00002174 File Offset: 0x00000374
		private void Form1_Load(object sender, EventArgs e)
		{
			this.read_data_str.iIndex = 0;
			this.connect_check_thread = new Thread(new ThreadStart(this.Connect_check_Handler));
			this.connect_check_thread.IsBackground = true;
			this.connect_check_thread.Start();
			this.monitor_thread = new Thread(new ThreadStart(this.monitor_Handler));
			this.monitor_thread.IsBackground = true;
			this.monitor_thread.Start();
		}

		// Token: 0x0600000C RID: 12 RVA: 0x000021EC File Offset: 0x000003EC
		public byte str_to_byte(string str)
		{
			byte[] bytes = Encoding.Default.GetBytes(str);
			byte[] array = new byte[bytes.Length / 2];
			for (int i = 0; i < bytes.Length; i++)
			{
				if (bytes[i] >= 97 && bytes[i] <= 102)
				{
					bytes[i] = (byte)(bytes[i] - 97 + 58);
				}
				else if (bytes[i] >= 65 && bytes[i] <= 70)
				{
					bytes[i] = (byte)(bytes[i] - 65 + 58);
				}
			}
			for (int j = 0; j < bytes.Length / 2; j++)
			{
				array[j] = (byte)((int)(bytes[j * 2] - 48) << 4 | (int)(bytes[j * 2 + 1] - 48));
			}
			return array[0];
		}

		// Token: 0x0600000D RID: 13 RVA: 0x00002282 File Offset: 0x00000482
		private void void_CH341StreamI2C_start()
		{
			this.read_data_str.do_ch341streami2c_mark = true;
			this.read_data_str.do_ch341streami2c_time = 0;
		}

		// Token: 0x0600000E RID: 14 RVA: 0x0000229C File Offset: 0x0000049C
		private void void_CH341StreamI2C_end()
		{
			this.read_data_str.do_ch341streami2c_mark = false;
			this.read_data_str.do_ch341streami2c_time = 0;
		}

		// Token: 0x0600000F RID: 15 RVA: 0x000022B8 File Offset: 0x000004B8
		private unsafe void write_button_Click(object sender, EventArgs e)
		{
			if (!this.WriteButtonClickErrorCheck())
			{
				return;
			}
			string text = this.send_Box.Text.Replace(" ", "");
			if (text.Length < 2)
			{
				MessageBox.Show("写入的数据长度错误");
				return;
			}
			byte[] bytes = Encoding.Default.GetBytes(text);
			byte[] array = new byte[bytes.Length / 2];
			for (int i = 0; i < bytes.Length; i++)
			{
				if (bytes[i] >= 97 && bytes[i] <= 102)
				{
					bytes[i] = (byte)(bytes[i] - 97 + 58);
				}
				else if (bytes[i] >= 65 && bytes[i] <= 70)
				{
					bytes[i] = (byte)(bytes[i] - 65 + 58);
				}
			}
			for (int j = 0; j < bytes.Length / 2; j++)
			{
				array[j] = (byte)((int)(bytes[j * 2] - 48) << 4 | (int)(bytes[j * 2 + 1] - 48));
			}
			this.send_data_len_Box.Text = (bytes.Length / 2).ToString();
			byte* oReadBuffer = stackalloc byte[(int)(UIntPtr)1];
			byte* ptr = stackalloc byte[(int)(UIntPtr)(3 + bytes.Length / 2)];
			*ptr = this.str_to_byte(this.addr_Box.Text);
			if (this.register_Box.Text.Length == 2)
			{
				this.read_data_str.register_l = this.str_to_byte(this.register_Box.Text);
				ptr[1] = this.read_data_str.register_l;
				for (int k = 0; k < bytes.Length / 2; k++)
				{
					ptr[k + 2] = array[k];
				}
				CH341_I2C.CH341StreamI2C(this.read_data_str.iIndex, 2 + bytes.Length / 2, ptr, 0, oReadBuffer);
				return;
			}
			if (this.register_Box.Text.Length == 4)
			{
				this.read_data_str.register_l = this.str_to_byte(this.register_Box.Text.Substring(2, 2));
				this.read_data_str.register_h = this.str_to_byte(this.register_Box.Text.Substring(0, 2));
				ptr[1] = this.read_data_str.register_h;
				ptr[2] = this.read_data_str.register_l;
				for (int l = 0; l < bytes.Length / 2; l++)
				{
					ptr[l + 3] = array[l];
				}
				CH341_I2C.CH341StreamI2C(this.read_data_str.iIndex, 3 + bytes.Length / 2, ptr, 0, oReadBuffer);
			}
		}

		// Token: 0x06000010 RID: 16 RVA: 0x00002500 File Offset: 0x00000700
		private bool ReadButtonClickErrorCheck()
		{
			if (this.read_data_len_Box.Text == "")
			{
				MessageBox.Show("读取长度为空");
				return false;
			}
			if (this.addr_Box.Text.Length != 2)
			{
				MessageBox.Show("地址长度错误");
				return false;
			}
			if (this.register_Box.Text.Length != 2 && this.register_Box.Text.Length != 4)
			{
				MessageBox.Show("寄存器长度错误,8位/16位");
				return false;
			}
			return !(this.connect_Box.Text == "未连接");
		}

		// Token: 0x06000011 RID: 17 RVA: 0x000025A0 File Offset: 0x000007A0
		private bool WriteButtonClickErrorCheck()
		{
			if (this.send_Box.Text == "")
			{
				MessageBox.Show("发送的数据为空");
				return false;
			}
			if (this.addr_Box.Text.Length != 2)
			{
				MessageBox.Show("地址长度错误");
				return false;
			}
			if (this.register_Box.Text.Length != 2 && this.register_Box.Text.Length != 4)
			{
				MessageBox.Show("寄存器长度错误,8位/16位");
				return false;
			}
			return !(this.connect_Box.Text == "未连接");
		}

		// Token: 0x06000012 RID: 18 RVA: 0x00002640 File Offset: 0x00000840
		private unsafe void read_button_Click(object sender, EventArgs e)
		{
			if (!this.ReadButtonClickErrorCheck())
			{
				return;
			}
			this.read_data_str.addr = (byte)(this.str_to_byte(this.addr_Box.Text) >> 1);
			if (this.register_Box.Text.Length == 2)
			{
				this.read_data_str.register_l = this.str_to_byte(this.register_Box.Text.Substring(0, 2));
			}
			if (this.register_Box.Text.Length == 4)
			{
				this.read_data_str.register_l = this.str_to_byte(this.register_Box.Text.Substring(2, 2));
				this.read_data_str.register_h = this.str_to_byte(this.register_Box.Text.Substring(0, 2));
			}
			this.read_data_str.read_data_len = int.Parse(this.read_data_len_Box.Text);
			byte* ptr = stackalloc byte[(int)(UIntPtr)this.read_data_str.read_data_len];
			byte* ptr2 = stackalloc byte[(int)(UIntPtr)3];
			*ptr2 = this.str_to_byte(this.addr_Box.Text);
			if (this.register_Box.Text.Length == 2)
			{
				ptr2[1] = this.read_data_str.register_l;
				CH341_I2C.CH341StreamI2C(this.read_data_str.iIndex, 2, ptr2, 0, ptr);
			}
			else
			{
				ptr2[1] = this.read_data_str.register_h;
				ptr2[2] = this.read_data_str.register_l;
				CH341_I2C.CH341StreamI2C(this.read_data_str.iIndex, 3, ptr2, 0, ptr);
			}
			*ptr2 = ((byte)(this.str_to_byte(this.addr_Box.Text) | 1));
			this.void_CH341StreamI2C_start();
			if (!CH341_I2C.CH341StreamI2C(this.read_data_str.iIndex, 1, ptr2, this.read_data_str.read_data_len, ptr))
			{
				if (this.read_data_str.do_ch341streami2c_time < this.do_ch341streami2c_overtime)
				{
					CH341_I2C.CH341ResetDevice(this.read_data_str.iIndex);
				}
				Thread.Sleep(200);
				return;
			}
			this.void_CH341StreamI2C_end();
			for (int i = 0; i < this.read_data_str.read_data_len; i++)
			{
				this.receive_Box.AppendText(ptr[i].ToString("x2") + " ");
			}
			this.receive_Box.AppendText("\r\n");
		}

		// Token: 0x06000013 RID: 19 RVA: 0x0000286B File Offset: 0x00000A6B
		private void read_data_len_Box_TextChanged(object sender, EventArgs e)
		{
		}

		// Token: 0x06000014 RID: 20 RVA: 0x0000286D File Offset: 0x00000A6D
		private void read_data_len_Box_KeyPress(object sender, KeyPressEventArgs e)
		{
			if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b')
			{
				e.Handled = true;
			}
		}

		// Token: 0x06000015 RID: 21 RVA: 0x0000286D File Offset: 0x00000A6D
		private void auto_send_time_Box_KeyPress(object sender, KeyPressEventArgs e)
		{
			if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b')
			{
				e.Handled = true;
			}
		}

		// Token: 0x06000016 RID: 22 RVA: 0x00002893 File Offset: 0x00000A93
		private void button3_Click(object sender, EventArgs e)
		{
			this.receive_Box.Text = "";
		}

		// Token: 0x06000017 RID: 23 RVA: 0x000028A5 File Offset: 0x00000AA5
		private void Auto_read_Handler()
		{
			for (;;)
			{
				Thread.Sleep(this.auto_read_time);
				this.read_button_Click(null, null);
			}
		}

		// Token: 0x06000018 RID: 24 RVA: 0x000028BC File Offset: 0x00000ABC
		private void auto_read_checkBox_CheckedChanged(object sender, EventArgs e)
		{
			if (this.auto_send_time_Box.Text == "")
			{
				if (this.auto_read_checkBox.Checked)
				{
					this.auto_read_checkBox.Checked = false;
				}
				return;
			}
			this.auto_read_time = int.Parse(this.auto_send_time_Box.Text);
			if (this.auto_read_checkBox.Checked)
			{
				this.auto_read_thread = new Thread(new ThreadStart(this.Auto_read_Handler));
				this.auto_read_thread.IsBackground = true;
				this.auto_read_thread.Start();
				return;
			}
			this.auto_read_thread.Abort();
		}

		// Token: 0x06000019 RID: 25 RVA: 0x0000286B File Offset: 0x00000A6B
		private void auto_send_time_Box_TextChanged(object sender, EventArgs e)
		{
		}


		// Token: 0x06000021 RID: 33 RVA: 0x0000286B File Offset: 0x00000A6B
		private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
		{
		}

		// Token: 0x06000022 RID: 34 RVA: 0x00002998 File Offset: 0x00000B98
		private void CH341_I2C_FormClosing(object sender, FormClosingEventArgs e)
		{
			Environment.Exit(0);
		}

		// Token: 0x06000023 RID: 35 RVA: 0x000029A0 File Offset: 0x00000BA0
		private void send_Box_KeyPress(object sender, KeyPressEventArgs e)
		{
			if ((e.KeyChar < '0' || e.KeyChar > '9') && (e.KeyChar < 'a' || e.KeyChar > 'f') && (e.KeyChar < 'A' || e.KeyChar > 'F') && e.KeyChar != ' ' && e.KeyChar != '\b')
			{
				e.Handled = true;
			}
		}

		// Token: 0x06000024 RID: 36 RVA: 0x00002A03 File Offset: 0x00000C03
		private void KToolStripMenuItem_Click(object sender, EventArgs e)
		{
			if (CH341_I2C.CH341SetStream(this.CH341_driver_num, 0))
			{
				MessageBox.Show("设置成功,20K速率");
				return;
			}
			MessageBox.Show("设置失败");
		}

		// Token: 0x06000025 RID: 37 RVA: 0x00002A2A File Offset: 0x00000C2A
		private void KToolStripMenuItem1_Click(object sender, EventArgs e)
		{
			if (CH341_I2C.CH341SetStream(this.CH341_driver_num, 1))
			{
				MessageBox.Show("设置成功,100K速率");
				return;
			}
			MessageBox.Show("设置失败");
		}

		// Token: 0x06000026 RID: 38 RVA: 0x00002A51 File Offset: 0x00000C51
		private void KToolStripMenuItem2_Click(object sender, EventArgs e)
		{
			if (CH341_I2C.CH341SetStream(this.CH341_driver_num, 2))
			{
				MessageBox.Show("设置成功,400K速率");
				return;
			}
			MessageBox.Show("设置失败");
		}

		// Token: 0x06000027 RID: 39 RVA: 0x00002A78 File Offset: 0x00000C78
		private void KToolStripMenuItem3_Click(object sender, EventArgs e)
		{
			if (CH341_I2C.CH341SetStream(this.CH341_driver_num, 3))
			{
				MessageBox.Show("设置成功,750K速率");
				return;
			}
			MessageBox.Show("设置失败");
		}

		// Token: 0x06000028 RID: 40 RVA: 0x0000286B File Offset: 0x00000A6B
		private void receive_Box_TextChanged(object sender, EventArgs e)
		{
		}

		// Token: 0x06000029 RID: 41 RVA: 0x0000286B File Offset: 0x00000A6B
		private void checkBox1_CheckedChanged(object sender, EventArgs e)
		{
		}

		// Token: 0x04000008 RID: 8
		private Thread connect_check_thread;

		// Token: 0x04000009 RID: 9
		private Thread auto_read_thread;

		// Token: 0x0400000A RID: 10
		private Thread monitor_thread;

		// Token: 0x0400000B RID: 11
		private int CH341_driver_num;

		// Token: 0x0400000C RID: 12
		private int do_ch341streami2c_overtime = 50;

		// Token: 0x0400000D RID: 13
		private int auto_read_time;

		// Token: 0x0400000E RID: 14
		private READ_DATA_STR read_data_str;
	}
}


CH341T_I2C源码.zip


登录后方可回帖

登 录
信息栏
本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...