Gửi 1 mảng lên PC bằng Uart

boyngo_58

Thành Viên PIF
Mình đang thử gửi lên PC 1 mảng vd: x[]=[1,2,3,4] dùng Uart.Làm sao để mình gửi tuần tự lên PC để khi dùng C# lưu lại đc cái mảng này....Bình thường thì dùng hyper terminal thì nó ra 1 dãy 1234.... còn dùng C# không bik làm sao hết.... mong mọi người giúp đỡ....;)
 
C# thì khi nhận được dữ liệu nó cũng gần giống với hyper terminal thôi bạn. cứ nhận được và hiển thị nó ra là ok.
 

boyngo_58

Thành Viên PIF
Vậy khi mình nhận trên PC thì 1234 là kiểu String phải ko bạn......
Nếu mình gửi tốc độc động cơ lên PC để vẽ đồ thị thì mình dùng như thế này ko đc.....:D
 
bạn xem lại mã mà mình đang dùng là mã ASCII nó chỉ khác kiểu số là hơn kiểu số 0x30. khi bạn có một số muốn chuyển về dạng ASCII thì chỉ việc cộng thêm 0x30 (hoặc '0') đây là số có một chữ số nhé. còn số có nhiều chữ số thì để hiển thị thì bạn có thể tách ra từng số và làm tương tự. còn nếu bạn không muốn hiển thị thì có thể để vậy truyền luôn nhưng số đó chỉ có thể biểu diễn không dấu và nhỏ hơn 256.
 

boyngo_58

Thành Viên PIF
Mình có 4 giá trị là 55 56 57 58.. gửi lên PC, nếu dùng lệnh Com.ReadExisting() thì mình nhận được 1 chuỗi string : 55565758.... vậy thì mún lấy từng số thì phải tách ra.. Vậy có cách nào phát hiện đã nhận được 1byte hoặc 2 byte để mình dễ xử lí hơn ko??? :D
 
Mình nghĩ thì bạn nên gởi chuỗi data lên PC theo một định dạng gì đấy.....ví dụ bạn có thể mã hóa đoạn data theo định dạng này: Header-Strleng-Number of byte-data-.....-End. Như vậy lập trình sẽ dễ hơn trong việc giãi mã đoạn data mà PC nhận được.
 

nguyenquoctrung-hhk

Thành Viên PIF
nếu để PC nhận được một mảng mà bạn dùng Com.ReadExisting() là không được, vì nó cứ thấy buffer của COM có gì là nó cứ đọc, chứ nó không biết dữ liệu bạn muốn điều khiển là ở dạng mảng.
trước hết bạn phải biết điều khiển cổng COM trong serial port của windows form. trước bạn phải định sẵn mảng bạn gửi từ PIC là bao nhiêu byte. UART mỗi lần truyền data của bạn là 8 bit cộng thêm bit start và bit stop là tổng cộng 10 bit truyền đi một lần. nếu mà bạn thêm bit parity nữa thì data là 9 bit, do đó bạn sẽ thu sai. cho nên dữ liệu của bạn phải đưa về 8 bit hết và không có parity, dù sao đường truyền ngắn tốc độ 9600 thì khó sai.
sang bên PC nó tự động tách bit start và bit stop để thu phần data là 1 byte 8 bit.
Vì thế trong serial port bạn coi thuộc tính Receive Byte Theasold mà là 1 thì có nghĩa rằng cứ 1 byte là nó ngắt lấy dữ liệu, như vậy muốn dùng mảng là không thể nào làm được trong khi bạn muốn gửi 56,57,58,59,...
giải pháp như sau :
*lưu ý khi đã làm việc với mảng thì dữ liệu bạn phải chuyển về kiểu byte hết.
_bạn phải định sẵn số byte bạn gửi từ PIC lên PC là bao nhiêu, giả sử tôi muốn gửi là 9 byte, thì sửa Receive Byte Theasold = 9. tự động COM sẽ chờ cho đến khi nào nhận đủ 9 byte thì mới nhảy vào ngắt.
_ khi nhảy vào ngắt bạn phải khai báo một mảng có kích thước là 9, sau đó bạn dùng cấu trúc đọc mảng từ COM như sau :

byte[] bufer = new byte[9];
Com.Read(bufer,0,9);

sau lệnh này bạn đã lưu được các giá trị của bạn vào trong mảng bufer, và bạn tiến hành xử lý cái mảng này. Vậy nhé, hehe!
 

nguyenvu

Thành Viên PIF
sẵn tiện hỏi luôn mọi người giúp mình chuyển dữ liệu từ kiểu int sang char ( số sang kí tự ) với cụ thể là :
Code:
#include <msp430.h>
#include "STE2007.h"
#include "PIF_logo.h"
#include "UART16.h"
unsigned int temp;
unsigned char t;
void ADC10_Init(void);
void ADC10_Init(void)
{
    ADC10CTL0 = SREF_1 + ADC10SHT_3 + ADC10ON + ADC10IE + REFON + ADC10SR;
    ADC10CTL1 = INCH_10 + ADC10DIV_1 + ADC10SSEL_0;
}
void lcd();
void lcd()
{
    BCSCTL1 = CALBC1_16MHZ;                        // Set range
    DCOCTL = CALDCO_16MHZ;                          // Set DCO step + modulation
    lcd_init();
    t=(char)temp;
    lcd_put_dec(temp);
    lcd_puts("t");
    lcd_put_dec(ADC10MEM);
}
void main(void) {
    int i;
    WDTCTL = WDTPW | WDTHOLD;                    // Stop watchdog timer
    Config_Clocks();    //Configure clock at 16MHz
    uart_init();        //Configure USCIA in UART Mode
    ADC10_Init ();
    ADC10CTL0 |= ENC + ADC10SC;    //Enable ADC10, Start sample - conversion
    _BIS_SR(LPM0_bits + GIE);
 
    while(1)
    {
        lcd_clear();
        lcd();
        UCA0TXBUF = t;// hay uart_puts("t");
        __delay_cycles(10000000);
    }
 
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
    temp=((ADC10MEM - 673) * 380) / 1024;
 
_bic_SR_register_on_exit(LPM0_bits);//Exit LPM0
}
chuyển biến temp dạng số sang kí tự rồi gửi lên uart, làm theo cách trên nó toàn hiện
 
Top