Thông báo

Collapse
No announcement yet.

Thắc mắc về UART của mcu stm8s

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Nguyên văn bởi elecpro Xem bài viết
    Bác cho em hỏi, làm sao để lưu được 1 mãng dữ liệu UART vào bộ nhớ của vi điều khiển sử dụng ngắt UART nhỉ?
    P/s em đã sử dụng được ngắt UART rồi ah!
    Bạn khai báo mảng để lưu. Sau đó mỗi lần lưu thì phần tử mảng tăng lên 1 để chọn phần tử tiếp theo.
    Code:
    unsigned char Mang[10]; // 10 phần tử
    unsigned char i=0; // Chọn phần tử trong Mảng
    void UART_Isr()
    {
        unsigned char temp_received;
        .... đọc lấy byte dữ liệu temp_received;
        Mang[i]=temp_received; // Lưu vào phần tử i
        if(i<9) i++; // Chọn phần tử tiếp theo trong mảng để lưu.
    }

    Comment


    • #17
      Nguyên văn bởi duong_act Xem bài viết
      Bạn khai báo mảng để lưu. Sau đó mỗi lần lưu thì phần tử mảng tăng lên 1 để chọn phần tử tiếp theo.
      Code:
      unsigned char Mang[10]; // 10 phần tử
      unsigned char i=0; // Chọn phần tử trong Mảng
      void UART_Isr()
      {
          unsigned char temp_received;
          .... đọc lấy byte dữ liệu temp_received;
          Mang[i]=temp_received; // Lưu vào phần tử i
          if(i<9) i++; // Chọn phần tử tiếp theo trong mảng để lưu.
      }
      Chào bác!
      Em thấy không ổn lắm, cái này chỉ lưu được 10 byte, nhưng nếu em gửi số byte lớn hơn hoặc bé hơn 10 byte thì code này không xong. Nó không lưu vào hết hoặc lưu đè lên nhau???
      Bác có cách nào mà linh động hơn không? Ý là lưu số byte tùy ý ấy
      Em đang code đọc sms và cuộc gọi từ SIM 900A về nhưng code bác đưa không thể nào làm được
      Điện thoại: 0989.285.187 hoặc 0122.407.4621 hoặc 0124.552.4920
      Địa chỉ: Đường Đỗ Xuân Hợp - Quận 9- TP.Hồ Chí Minh.

      Comment


      • #18
        Nguyên văn bởi elecpro Xem bài viết
        Chào bác!
        Em thấy không ổn lắm, cái này chỉ lưu được 10 byte, nhưng nếu em gửi số byte lớn hơn hoặc bé hơn 10 byte thì code này không xong. Nó không lưu vào hết hoặc lưu đè lên nhau???
        Bác có cách nào mà linh động hơn không? Ý là lưu số byte tùy ý ấy
        Em đang code đọc sms và cuộc gọi từ SIM 900A về nhưng code bác đưa không thể nào làm được
        Bạn google từ khóa "ring buffer" để tìm hiểu thêm.

        Comment


        • #19
          Nguyên văn bởi vaa_dtvn Xem bài viết
          Bạn google từ khóa "ring buffer" để tìm hiểu thêm.
          Có cái ví dụ nào cụ thể dễ hiểu ko bạn?
          Điện thoại: 0989.285.187 hoặc 0122.407.4621 hoặc 0124.552.4920
          Địa chỉ: Đường Đỗ Xuân Hợp - Quận 9- TP.Hồ Chí Minh.

          Comment


          • #20
            Nguyên văn bởi elecpro Xem bài viết
            Chào bác!
            Em thấy không ổn lắm, cái này chỉ lưu được 10 byte, nhưng nếu em gửi số byte lớn hơn hoặc bé hơn 10 byte thì code này không xong. Nó không lưu vào hết hoặc lưu đè lên nhau???
            Bác có cách nào mà linh động hơn không? Ý là lưu số byte tùy ý ấy
            Em đang code đọc sms và cuộc gọi từ SIM 900A về nhưng code bác đưa không thể nào làm được
            Đấy là cách để lưu đơn giản và đó chỉ là ví dụ cơ bản.
            Để lưu nhiều byte hơn bạn phải sử dụng mảng lớn hơn nếu RAM đủ chỗ, khai báo mảng 1KB hay 2,3KB cũng không sao.
            Nếu lưu số byte ít hơn thì bạn phải điều chỉnh tham số i để lưu vào vị trí nào, cái này bạn phải xử lý dữ liệu gửi- phải có dấu hiệu để biết được SOF(start of frame). Mảng kia chỉ là mảng để tạm thời lưu dữ liệu, sau đó phải xử lý và xóa nó đi, nếu không dù mảng có lớn bao nhiêu rồi cũng sẽ tràn, mất dữ liệu.
            Có thể thêm cờ, biến để giám sát trạng thái cái buffer.
            Và thông thường dữ liệu người ta sẽ gửi theo frame data, tức là số byte là cố định.
            ___
            Mình thì không thấy vấn đề gì, vấn đề là cách áp dụng của bạn thôi

            Comment


            • #21
              Nguyên văn bởi duong_act Xem bài viết
              Đấy là cách để lưu đơn giản và đó chỉ là ví dụ cơ bản.
              Để lưu nhiều byte hơn bạn phải sử dụng mảng lớn hơn nếu RAM đủ chỗ, khai báo mảng 1KB hay 2,3KB cũng không sao.
              Nếu lưu số byte ít hơn thì bạn phải điều chỉnh tham số i để lưu vào vị trí nào, cái này bạn phải xử lý dữ liệu gửi- phải có dấu hiệu để biết được SOF(start of frame). Mảng kia chỉ là mảng để tạm thời lưu dữ liệu, sau đó phải xử lý và xóa nó đi, nếu không dù mảng có lớn bao nhiêu rồi cũng sẽ tràn, mất dữ liệu.
              Có thể thêm cờ, biến để giám sát trạng thái cái buffer.
              Và thông thường dữ liệu người ta sẽ gửi theo frame data, tức là số byte là cố định.
              ___
              Mình thì không thấy vấn đề gì, vấn đề là cách áp dụng của bạn thôi
              Vậy bác cho em hỏi, ví dụ như con SIM900A, khi nó trả về thì độ dài của nó không cố định ví dụ như SMS, Call,... Như vậy ta phải đọc thể nào bác nhỉ?
              Điện thoại: 0989.285.187 hoặc 0122.407.4621 hoặc 0124.552.4920
              Địa chỉ: Đường Đỗ Xuân Hợp - Quận 9- TP.Hồ Chí Minh.

              Comment


              • #22
                Nguyên văn bởi elecpro Xem bài viết
                Vậy bác cho em hỏi, ví dụ như con SIM900A, khi nó trả về thì độ dài của nó không cố định ví dụ như SMS, Call,... Như vậy ta phải đọc thể nào bác nhỉ?
                Vậy bạn cho biết độ dài không cố định là bao nhiêu ? 100 byte hay 1KB hay 10MB ?

                Ví dụ luôn với SMS. Nó sẽ truyền theo từng tin. Mỗi tin ví dụ dài 1024 kí tự thì tui khai báo mảng 1024 phần tử. Nếu SMS dài 2048 byte thì dùng mảng 2KB. Nếu tốc độ tin đến chậm tui có thể chỉ cần mảng 10 hay 100 byte, nhận đủ số byte thì lưu vào RAM ngoài.

                Với Call tui chưa biết tốc độ của nó, nếu bạn nói ra tui nói luôn cho
                Last edited by duong_act; 29-12-2014, 18:34.

                Comment


                • #23
                  Mình cũng đang đau đầu với module uart của stm8s003f3p. Đây là code của mình

                  static void CLK_Config(void)
                  {
                  CLK_DeInit();
                  CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
                  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
                  delay(80000);

                  }

                  void uartInit(void)
                  {


                  UART1_DeInit();
                  /* Set PA5 as Output open-drain high-impedance level (UART1_Tx)*/
                  GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);

                  /* UART1 configuration ------------------------------------------------------*/
                  /* UART1 configured as follow:
                  - BaudRate = 9600 baud
                  - Word Length = 8 Bits
                  - One Stop Bit
                  - No parity
                  - Receive and transmit enabled
                  - UART1 Clock disabled
                  */

                  UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
                  UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
                  UART1_Cmd(ENABLE);
                  }

                  Mình dùng giao động ngoài 16Mhz. Soi osciloscope thì thấy uart vẫn truyền bình thường, nhưng baud rate rất lớn.
                  Dùng giao động nội cũng bị hiện tượng này. Mình dùng ST Visual Develop IDE + Cosmic. Lúc trước thấy nó làm việc ok rồi, sau đó mình chỉnh sửa gì ở phần config option byte hay là config clock gì đấy giờ lại bị hiện tượng trên.
                  bạn nào có kinh nghiệm về cái này tư vấn giúp mình.

                  Comment

                  Về tác giả

                  Collapse

                  vanhuonga6 Tìm hiểu thêm về vanhuonga6

                  Bài viết mới nhất

                  Collapse

                  Đang tải...
                  X