Hỏi cách nhận dữ liệu từ PIC gửi lên PC

Khuyết Danh

Trứng gà
Chào các anh chị.
Như tiêu đề em đang vướng chỗ nhận dữ liệu từ PIC gửi lên PC.
Em dùng PIC 16F887, gửi lên PC qua giao tiếp RS232. Gửi nhiệt độ đo được qua cảm biến LM35.
Trong ccs em code để xuất dữ liệu như sau:

Code:
 x = read_ADC();
    x = ((5000.0/1023*x)/10);
  c = getc();
  x = 2;
  putc(x);
Và trong Visual Studio C#, em nhận dữ liệu code thế này:
Code:
private void onCom(object sender, SerialDataReceivedEventArgs e)
        {
            string s;
            s = serialPort1.ReadExisting();
            Display(s);
        }
        private delegate void DlDisplay(string s);
        private void Display(string s)
        {
            if(label1.InvokeRequired)
            {
                DlDisplay sd = new DlDisplay(Display);
                label1.Invoke(sd, new object[] { s });
            }
            else
            {
                label1.Text += s;
            }
        }
Nhưng khi chạy thử thì PIC gửi dữ liệu lên PC nhận và xuất ra label chỉ là mấy dấu "?".
Em mày mò mấy hôm nay rồi nhưng chưa giải quyết được. Anh chị nào có kinh nghiệm vụ này giúp em với ạ. Cảm ơn PIF nhiều.
 

2death

Cố Vấn CLB
Staff member
Hi em,
Hàm putc(x);
Hàm này gửi dữ liệu qua uart như thế nào?
Em lưu ý là dữ liệu gửi đi qua uart lên PC phải dưới dạng ký tự (Char) hoặc chuỗi ký tự (String).
Giả sử muốn gửi số 1234 lên PC, thì mình phải tách thành 4 ký tự: '1', '2',...
Trong đó ký tự '1' có mã Ascii là 0x31 (ở hệ thập phân là 49). Xem thêm Ascii table: http://www.asciitable.com/
Như vậy, dữ liệu mình gửi đi phải là 4 kí tự sau: 0x31, 0x32, 0x33, 0x34.
(Chưa kể phải gửi thêm kí tự kết thúc chuỗi, thường là 1 ký tự đặc biệt do code mình tự quy định để trên PC biết là đọc chuỗi tới đó thì dừng).
Nếu coi sơ sơ vậy thì putc(x);
với x = 2 như code ở trên thì em đang gửi lên PC 1 số khá là vô nghĩa :brick:
 

Khuyết Danh

Trứng gà
Hi em,
Hàm putc(x);
Hàm này gửi dữ liệu qua uart như thế nào?
Em lưu ý là dữ liệu gửi đi qua uart lên PC phải dưới dạng ký tự (Char) hoặc chuỗi ký tự (String).
Giả sử muốn gửi số 1234 lên PC, thì mình phải tách thành 4 ký tự: '1', '2',...
Trong đó ký tự '1' có mã Ascii là 0x31 (ở hệ thập phân là 49). Xem thêm Ascii table: http://www.asciitable.com/
Như vậy, dữ liệu mình gửi đi phải là 4 kí tự sau: 0x31, 0x32, 0x33, 0x34.
(Chưa kể phải gửi thêm kí tự kết thúc chuỗi, thường là 1 ký tự đặc biệt do code mình tự quy định để trên PC biết là đọc chuỗi tới đó thì dừng).
Nếu coi sơ sơ vậy thì putc(x);
với x = 2 như code ở trên thì em đang gửi lên PC 1 số khá là vô nghĩa :brick:
Chào anh.
Em thử dùng ngắt tràn Timer0 để nhận dữ liệu từ PIC truyền lên PC dưới dạng string, tuy nhiên khi nhiệt độ thay đổi nhiệt độ gửi lên PC vẫn ko thay đổi ( trừ khi reset mạch).
Thêm cái nữa là gửi dữ liệu từ PC xuống PIC không hoàn thành được. Vd như em truyền chữ: Hello word thì nó chỉ hiện hel thôi.
Đây là code em code cho PIC bằng ccs, em nghĩ chỉ có cái code này có vấn đề chứ trên VS chắc ko sai. Anh xem giúp em với, hơn 2h sáng rồi vẫn chưa ngủ được :(
Code:
/*
* File:  main.c
* Author: nmphu
*
* Created on October 3, 2016, 4:02 PM
*/
 
#include <16F887.h>
 
#device *=16adc=10
#fuses HS,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
 
#define LCD_ENABLE_PIN  PIN_D2                                    ////
#define LCD_RS_PIN      PIN_D0                                    ////
#define LCD_RW_PIN      PIN_D1                                    ////
#define LCD_DATA4      PIN_D4                                    ////
#define LCD_DATA5      PIN_D5                                    ////
#define LCD_DATA6      PIN_D6                                    ////
#define LCD_DATA7      PIN_D7   
#include <LCD.C>
 
float x;
int a;
char c;
 
int16 count_t0=0;
int8 str[20];
#INT_RTCC
void sendData()  // Sau 1s thi cap nhat nhiet do len PC
{
  count_t0++;
  if(count_t0==4883)
  {
      count_t0=0;
      puts(str);  // Truyen gia tri nhiet do do duoc len PC
  }
}
 
 
void receiveData()
{
    char c;
    c =  getc(); 
    if( c == '1')
    {
        lcd_send_byte(0,0x01);
    }
    if (c != '1')
    {
        lcd_putc(c);
    }
}
 
void main()
{
   
    lcd_init();
    set_tris_d(0x00); 
    setup_ADC(ADC_CLOCK_INTERNAL);
     
    enable_interrupts(INT_TIMER0); 
    enable_interrupts(GLOBAL);     
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); 
    set_timer0(0x00);   
 
    while(1)
    {
        setup_ADC_ports(sAN0);
        set_ADC_channel(0);
        delay_us(100);
        x = read_ADC();
        x = ((5000.0/1023*x)/10);
       
        sprintf(str,"Nhiet Do = %3.1f",x);
        receiveData();
       
    }
}
Em cảm ơn ạ!
 
Top