Như bạn tbk_05 đã giải quyết là cách cơ bản và dễ dàng nhất, cắt số integer 16bits chứa giá trị ADC 10bits sau đó ghép lại phía nhận.
Tuy nhiên cách này làm thủ công bằng tay nên khá mệt và dễ lộn xộn. Cách mình trình bày trên sẽ dễ dàng truyền nhận ko chỉ số integer 16 bits mà còn có thể áp dụng cho số 32 bits, các kiểu dữ liệu khác hoặc là 1 struct phức tạp.
Giả sử như với khai báo trên, phía VDK bạn đọc 3 kênh ADC sau đó gởi vào USB:
Code:
set_adc_channel(0);
adc.ADC0=read_adc(); // 100
set_adc_channel(1);
adc.ADC1=read_adc(); // 200
set_adc_channel(2);
adc.ADC2=read_adc(); // 300
...
usb_put_data((char*)&adc,sizeof(USBAdc)) // Giả sử gởi array là 6 bytes
Ở phía PC, giải sử việc đọc từ USB được 1 mảng byte là usb_byte_array(dĩ nhiên là 1 array 6 bytes như lúc gởi), sau đó dùng phương thức FromByteArray của lớp USBAdc chuyển thành 1 đối tượng USBAdc và sử dụng dữ liệu như bình thường:
Code:
USBAdc adc= USBAdc.FromByteArray(usb_byte_array);
...
TextBox0.Text = adc.ADC0; // Giá trị sẽ là 100
TextBox1.Text = adc.ADC1; // Giá trị sẽ là 200
TextBox2.Text = adc.ADC2; // Giá trị sẽ là 300
...
Như code trên, hoàn toàn ko cần cắt/ghép hay xử lý gì hết. Chỉ đơn giản là sử dụng khả năng chuyển kiểu của C và C# để thực hiện.
Bạn có thể mở rộng hơn 6 bytes hoặc thêm bớt các thành phần, biến, cấu trúc dữ liệu khác cho khai báo USBAdc, miễn sao đảm bảo đúng thứ tự và cấu trúc tương ứng 1 gói giữa C/VDK và C#/PC là ok.
Regards