hỏi về VD 5_2 của anh Nam

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • tuongdtd
    Đệ tử 2 túi
    • Nov 2009
    • 27

    #1

    hỏi về VD 5_2 của anh Nam

    chào các bác trên diễn đàn!
    dưới đây là đoạn code trong vd5-2 của anh Nam:
    while (1) {
    if (flag) { //Neu co ket qua moi thi xuat ket qua
    idx = (ADCValue >> 8); //Nibble cao nhat (chi co 2 bit)
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    idx = ((ADCValue >> 4) & 0x000F); //Nibble thu hai
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    idx = (ADCValue & 0x000F); //Nibble thap nhat
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    U1TXREG = 0x0A; //Cap ky tu CR, LF
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    U1TXREG = 0x0D;
    flag = 0; //Xoa co bao hieu co ket qua moi
    };
    };
    theo em hiểu như thế này ko biết có đúng ko?
    giả sử ADCvalue = 0x037f
    ban đầu ta lấy 2 bit cao nhất tức là idx =0x0003
    ta lấy 4 bit tiếp theo idx= 0x0007
    và 4 bit cuối idx = 0x000f.
    vậy ta sẽ gửi 3 byte lên máy tính, nhưng tai sao ta không gửi U1TXREG = idx mà phải sử dụng U1TXREG = HexTable[idx]?
    tại sao ta lại phải truyền thêm hai ký tự CR và LF?
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #2
    Nguyên văn bởi tuongdtd View Post
    chào các bác trên diễn đàn!
    dưới đây là đoạn code trong vd5-2 của anh Nam:
    while (1) {
    if (flag) { //Neu co ket qua moi thi xuat ket qua
    idx = (ADCValue >> 8); //Nibble cao nhat (chi co 2 bit)
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    idx = ((ADCValue >> 4) & 0x000F); //Nibble thu hai
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    idx = (ADCValue & 0x000F); //Nibble thap nhat
    U1TXREG = HexTable[idx]; //Chuyen thanh ky tu tuong ung
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    U1TXREG = 0x0A; //Cap ky tu CR, LF
    while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
    U1TXREG = 0x0D;
    flag = 0; //Xoa co bao hieu co ket qua moi
    };
    };
    theo em hiểu như thế này ko biết có đúng ko?
    giả sử ADCvalue = 0x037f
    ban đầu ta lấy 2 bit cao nhất tức là idx =0x0003
    ta lấy 4 bit tiếp theo idx= 0x0007
    và 4 bit cuối idx = 0x000f.
    vậy ta sẽ gửi 3 byte lên máy tính, nhưng tai sao ta không gửi U1TXREG = idx mà phải sử dụng U1TXREG = HexTable[idx]?
    tại sao ta lại phải truyền thêm hai ký tự CR và LF?
    Các giá trị 0x00 đến 0x0F sẽ không hiển thị được trên màn hình máy tính (trong bảng mã ASCII trên máy tính, bất kỳ ký tự nào có mã dưới 0x20 đều là ký tự không hiển thị được), do đó cần phải chuyển các giá trị này thành ký tự ASCII tương ứng. Ví dụ, giá trị 0x07 cần được chuyển thành ký tự '7' (có mã ASCII là 0x37) trước khi gửi về máy tính. Việc dùng bảng HexTable[] là một trong những cách chuyển đổi đó.

    Hai ký tự CR và LF để về đầu dòng và xuống dòng trên Hyper Terminal thôi.

    Thân,
    Biển học mênh mông, sức người có hạn.

    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
    http://www.picvietnam.com/forum/showthread.php?t=1263

    Comment

    • tuongdtd
      Đệ tử 2 túi
      • Nov 2009
      • 27

      #3
      anh cho em hỏi thêm, khi đó trên máy tính ta sẽ nhận được mã ASCII của ký tự, sau đó ta lại chuyển mã ASCII thành ký tự tương ướng phai ko ah?
      khi đó em dùng VB viết chương trình nhận trên máy tính:

      dim x,y as string
      Private Sub MSComm1_OnComm()
      If (MSComm1.CommEvent = comEvReceive) Then
      x = MSComm1.Input 'doc du lieu cong com

      khi đó x là mã ASCII của 5 ký tự nhận từ VDK phải ko ah?
      sau đó em tách lấy ký tự thứ nhất bằng lệnh
      y= mid(x,1,1)
      vậy thì "y" của em sẽ nhận được mã ASCII của ký tự thứ nhất phai ko ah?
      nhưng "y" nhận được các chữ cái khác không phải các ký tự "0123456789ABCDEF"
      anh chỉ cho em thuật toán nhân trên máy tính nhé!
      Last edited by tuongdtd; 29-12-2009, 10:55 AM.

      Comment

      • namqn
        Trưởng lão PIC bang
        • Feb 2006
        • 3020

        #4
        Nguyên văn bởi tuongdtd View Post
        anh cho em hỏi thêm, khi đó trên máy tính ta sẽ nhận được mã ASCII của ký tự, sau đó ta lại chuyển mã ASCII thành ký tự tương ướng phai ko ah?
        khi đó em dùng VB viết chương trình nhận trên máy tính:

        dim x,y as string
        Private Sub MSComm1_OnComm()
        If (MSComm1.CommEvent = comEvReceive) Then
        x = MSComm1.Input 'doc du lieu cong com

        khi đó x là mã ASCII của 5 ký tự nhận từ VDK phải ko ah?
        sau đó em tách lấy ký tự thứ nhất bằng lệnh
        y= mid(x,1,1)
        vậy thì "y" của em sẽ nhận được mã ASCII của ký tự thứ nhất phai ko ah?
        nhưng "y" nhận được các chữ cái khác không phải các ký tự "0123456789ABCDEF"
        anh chỉ cho em thuật toán nhân trên máy tính nhé!
        Xin lỗi là tôi không nhận ra bạn hỏi thêm một câu nữa.

        Tôi cho là trên máy tính bạn muốn có lại giá trị số đã được gửi. Việc chuyển thành mã ASCII là để cho mục đích hiển thị, nếu bạn muốn có giá trị gốc thì không cần chuyển sang ASCII rồi sau đó chuyển ngược lại làm gì (chỉ gửi 2 byte của giá trị 16-bit rồi ở trên máy tính nối các byte này lại theo đúng thứ tự thôi).

        Hơn 10 năm rồi tôi không dùng VB, nên tôi không chắc về phần trả lời sau đây. Nhưng tôi nghĩ đoạn code của bạn sẽ không cho kết quả x là chuỗi ký tự ASCII đã gửi đâu, mà mỗi ký tự nhận được tại máy tính sẽ tạo ra một CommEvent.

        Thân,
        Biển học mênh mông, sức người có hạn.

        Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
        http://www.picvietnam.com/forum/showthread.php?t=1263

        Comment

        • npbaoduy
          Đệ tử 2 túi
          • Sep 2008
          • 38

          #5
          Nguyên văn bởi tuongdtd View Post
          anh cho em hỏi thêm, khi đó trên máy tính ta sẽ nhận được mã ASCII của ký tự, sau đó ta lại chuyển mã ASCII thành ký tự tương ướng phai ko ah?
          khi đó em dùng VB viết chương trình nhận trên máy tính:

          dim x,y as string
          Private Sub MSComm1_OnComm()
          If (MSComm1.CommEvent = comEvReceive) Then
          x = MSComm1.Input 'doc du lieu cong com

          khi đó x là mã ASCII của 5 ký tự nhận từ VDK phải ko ah?
          sau đó em tách lấy ký tự thứ nhất bằng lệnh
          y= mid(x,1,1)
          vậy thì "y" của em sẽ nhận được mã ASCII của ký tự thứ nhất phai ko ah?
          nhưng "y" nhận được các chữ cái khác không phải các ký tự "0123456789ABCDEF"
          anh chỉ cho em thuật toán nhân trên máy tính nhé!
          Bạn thử dụng hàm asc(x) xem sao.
          Ví dụ, dưới vdk bạn gởi: U1TXREG=0x41 chẳng hạn
          trên VB: x = MSComm1.Input, thì lúc đó x là ký tự 'A'
          y=asc(x); y = 65 (=0x41).

          Comment

          Working...