Thông báo

Collapse
No announcement yet.

Hỏi về lập trình giao tiếp

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

  • Hỏi về lập trình giao tiếp

    Chào các bạn!
    Các bạn cho mình hỏi rằng: khi VDk truyền tín hiệu lên pc(mình dùng VB6) thì phải chuyển tín hiệu sang mã ASCII để truyền, vậy khi mình muốn truyền tín hiệu từ pc xuống thì trên VB6 mình phải chuyển tín hiệu thành mã gì để vdk có thể nhận được.
    Cảm ơn cả nhà nhé!

  • #2
    Nguyên văn bởi caube Xem bài viết
    Chào các bạn!
    Các bạn cho mình hỏi rằng: khi VDk truyền tín hiệu lên pc(mình dùng VB6) thì phải chuyển tín hiệu sang mã ASCII để truyền, vậy khi mình muốn truyền tín hiệu từ pc xuống thì trên VB6 mình phải chuyển tín hiệu thành mã gì để vdk có thể nhận được.
    Cảm ơn cả nhà nhé!
    mã nào mà chẳng được chủ yếu là bạn sẽ xữ lý thế nào thôi

    Comment


    • #3
      Vậy thì bạn làm ơnnói rõ cho mình một chút đi, mình chưa rõ lắm!!!
      Cảm ơn nhé!

      Comment


      • #4
        Nguyên văn bởi tranpic Xem bài viết
        mã nào mà chẳng được chủ yếu là bạn sẽ xữ lý thế nào thôi
        Đúng đó bạn, nếu bạn gởi ASCII ví dụ là ký tự 'a' thì giá trị bạn nhận được là 97 thập phân hay 61 hexal, vậy bạn gởi ký tự 'a' cũng giống như bạn gởi số 97d hay gởi 61h vậy.

        Nếu truyền từ VĐK lên, thông thường với dữ liệu không phức tạp người ta dùng ascii để gởi, ví dụ, bạn muốn gởi số 61 hexal từ VĐK lên máy tính, nếu bạn gởi giá trị 61h thì máy tính sẽ nhận được ký tự 'a', nhưng nếu bạn gởi ký tự '6' ascii và ký tự '1' ascii thì máy tính sẽ nhận được là chuỗi ký tự "61" nếu thêm /0 cuối
        và sẽ có hàm chuyển đổi từ "61" này ra số 61 thập phân hay 61hexal tùy vào redix của bạn là 10 hay 16.
        Diễn đàn Vi điều khiển:

        Comment


        • #5
          Các pác giải thích thế càng giải thích càng rối rắm.
          Chốt lại như thế này:
          - Truyền từ VĐK lên thì truyền số thập phân hoặc nhị phân hoặc hexal đều ok.
          - Phần mềm viết bằng VB6 sẽ nhận giá trị đó là mã ascii => nếu muốn hiển thị đúng là giá trị thập phân thì phải dùng một hàm chuyển đổi có sẵn trong thư viện, nếu không chuyển đổi thì từ VĐK gửi lên giá trị 97 thì máy tính sẽ hiển thị chữ 'a'.
          - Ngược lại, truyền từ máy tính xuống VĐK thì phải chuyển đổi từ số bạn đình truyền sang mã ascii rồi truyền đi(mấy cái hàm này được VB6 hỗ trợ hết), VĐK nhận được luôn là số chứ không phải là mã ascii.
          Nghĩa là VĐK không phải giả mã gì cả, việc giải mã, chuyển đổi giữa các giá trị thành mã ascii và ngược lại là phần xử lý trên máy tính.
          (Do mình ngồi ngoài hàng net nên không nhớ rõ mấy cái hàm chuyển đổi đó, hẹn bạn ngày mai mình sẽ post lên.)

          Comment


          • #6
            Nguyên văn bởi sun_rise Xem bài viết
            - Ngược lại, truyền từ máy tính xuống VĐK thì phải chuyển đổi từ số bạn đình truyền sang mã ascii rồi truyền đi(mấy cái hàm này được VB6 hỗ trợ hết), VĐK nhận được luôn là số chứ không phải là mã ascii.
            Nghĩa là VĐK không phải giả mã gì cả, việc giải mã, chuyển đổi giữa các giá trị thành mã ascii và ngược lại là phần xử lý trên máy tính.
            Mình không định trả lời, nhưng mà có thể bạn hiểu sai vấn đề rất trầm trọng, nên ngứa tay chịu không được, phải reply thôi.

            Ví dụ như mình cần truyền từ Máy tính 1 số có giá trị là 97 thập phân, vậy nếu như cách bạn truyền là dùng ascii chuyển đi, vậy 97 có phải là 2 ký tự ascii có giá trị tương đương 2 byte là '9' và '7'. Vi điều khiển nhận được, hiểu nó có giá trị 97 chết liền vài chục lần

            Ký tự ASCII chỉ có 1 mục đích duy nhất là hiển thị thôi, giá trị thực khi chuyển đi là 97, nếu chuyển nó thành ascii thì là 2 byte '9' và '7'. Ngược lại, nếu để nguyên là 97 tương đương với 'a'.

            Quả thật cũng chẳng đến mức phức tạp quá đâu, nếu bạn làm giao tiếp máy tính, mấy vụ này xong lâu rồi, về vấn đề này mình không tranh cãi nữa nhé.
            Diễn đàn Vi điều khiển:

            Comment


            • #7
              cảm ơn các bạn đã trả lời! Nhưng thật sự các bạn trả lời thế thì mình ko thể rõ được! Mình ko biết mới nhờ các bạn giúp đỡ chứ, bạn minhtuan04 biết thì nói rõ hơn cho mình đi, bạn nói qua qua thế thì mình khó hiểu quá!
              Mình hiểu là khi truyền từ vdk lên máy tính thì cần biết đổi số ra ASCII để hiển thị; Còn khi truyền từ máy tính xuống vdk thì mình ko rõ lắm đâu. VD: Mình muốn truyền số 97hex xuống vdk và muốn vdk nhận được đúng số 97hex thì mình phải truyền như thế nào?
              Mong các bạn biết rồi thì nhiệt tình trả lời giúp mình và những người mới làm!
              Cảm ơn các bạn!

              Comment


              • #8
                Nguyên văn bởi caube Xem bài viết
                cảm ơn các bạn đã trả lời! Nhưng thật sự các bạn trả lời thế thì mình ko thể rõ được! Mình ko biết mới nhờ các bạn giúp đỡ chứ, bạn minhtuan04 biết thì nói rõ hơn cho mình đi, bạn nói qua qua thế thì mình khó hiểu quá!
                Mình hiểu là khi truyền từ vdk lên máy tính thì cần biết đổi số ra ASCII để hiển thị; Còn khi truyền từ máy tính xuống vdk thì mình ko rõ lắm đâu. VD: Mình muốn truyền số 97hex xuống vdk và muốn vdk nhận được đúng số 97hex thì mình phải truyền như thế nào?
                Mong các bạn biết rồi thì nhiệt tình trả lời giúp mình và những người mới làm!
                Cảm ơn các bạn
                !
                Bạn cần cái này đây mà:
                Lệnh trên VB gửi xuống VĐK như sau-MSComm1.Output = Chr(&H97) - số 97hex theo đúng yêu cầu nhé.
                Còn truyền 1 số bất kỳ thì- MSComm1.Output = Chr(x)
                VĐK sẽ nhận được đúng số x, nhớ là 0=<x<=255

                email:mahaco@fpt.vn

                Comment


                • #9
                  Mình không định trả lời, nhưng mà có thể bạn hiểu sai vấn đề rất trầm trọng, nên ngứa tay chịu không được, phải reply thôi.

                  Ví dụ như mình cần truyền từ Máy tính 1 số có giá trị là 97 thập phân, vậy nếu như cách bạn truyền là dùng ascii chuyển đi, vậy 97 có phải là 2 ký tự ascii có giá trị tương đương 2 byte là '9' và '7'. Vi điều khiển nhận được, hiểu nó có giá trị 97 chết liền vài chục lần

                  Ký tự ASCII chỉ có 1 mục đích duy nhất là hiển thị thôi, giá trị thực khi chuyển đi là 97, nếu chuyển nó thành ascii thì là 2 byte '9' và '7'. Ngược lại, nếu để nguyên là 97 tương đương với 'a'.

                  Quả thật cũng chẳng đến mức phức tạp quá đâu, nếu bạn làm giao tiếp máy tính, mấy vụ này xong lâu rồi, về vấn đề này mình không tranh cãi nữa nhé.
                  Bác nói thế lại càng làm em ngứa tay. Một lần truyền hoàn toàn có thể truyền đi số 97 và nhận về số 97 theo cái cách của em đấy.
                  Code:
                  Đây là 2 hàm truyền và nhận viết trên VB (và như em đã nói, VDK cứ làm việc bình
                  thường, không phải giải mã giải miếc gì hết, đọc ra là dùng thôi).
                  
                  Nhận = Asc(MSComm.Input)
                  MSComm.Output = Chr$(truyền)
                  Bác cứ thử đi. Sai đâu em chịu. Chỉ có điều các giá trị truyền và nhận là phải trong khoảng giá trị 8bit, nếu lớn hơn thì phải cắt ra thành các giá trị 8bit để truyền và nhận.
                  Em cũng không phủ định cách của bác là sai. Tuy nhiên cách của em, nếu truyền 97 thì chỉ làm việc như sau:
                  MSComm.Output = Chr$(97)
                  Nếu nhận giá trị về thì chỉ việc như sau:
                  nhận = Asc(MSComm.Input)
                  Còn làm theo cách của bác thì phải tách 1 số thành nhiều chữ số rồi truyền.
                  Nếu không tin thì thử hết đi xem ai đúng, ai sai.

                  Comment


                  • #10
                    Cảm ơn các bạn đã nhiệt tình giúp đỡ. Mình có khúc mắc nhờ các bạn chỉ bảo đây, truyền nhận thì mình đã hiểu rồi, nhưng sử dụng mỗi ngắt nối tiếp thì có vẻ khó điều khiển quá các bạn nhỉ?
                    - Mình có con led 7 thanh kết nối với port1, và điều khiển cho đếm từ 1 => 9 bằng máy tính như sau:
                    - Trên vb mình có 2 nút: Nút 1 khi ấn thì led đếm từ 1 => 4 rồi lại quay về 1, cứ lặp đi lặp lại như vậy.
                    Nút 2 khi ấn thì led đếm từ 5 => 9 rồi lại quay về 5, lặp đi lặp lại như vậy.
                    => phần truyền dữ liệu từ vb xuống vdk thì như các bạn đã giải thích hết rồi, còn phần code của vdk (mình viết mãi mà ko xong) dùng mỗi RI để tạo ngắt nối tiếp có vẻ khó xử lý quá(với mình).
                    Mong các bạn chỉ bảo mình với.
                    Cảm ơn các bạn!

                    Comment


                    • #11
                      Không có ai chịu cho mình ý kiến sao?

                      Comment


                      • #12
                        Nguyên văn bởi caube Xem bài viết
                        Cảm ơn các bạn đã nhiệt tình giúp đỡ. Mình có khúc mắc nhờ các bạn chỉ bảo đây, truyền nhận thì mình đã hiểu rồi, nhưng sử dụng mỗi ngắt nối tiếp thì có vẻ khó điều khiển quá các bạn nhỉ?
                        - Mình có con led 7 thanh kết nối với port1, và điều khiển cho đếm từ 1 => 9 bằng máy tính như sau:
                        - Trên vb mình có 2 nút: Nút 1 khi ấn thì led đếm từ 1 => 4 rồi lại quay về 1, cứ lặp đi lặp lại như vậy.
                        Nút 2 khi ấn thì led đếm từ 5 => 9 rồi lại quay về 5, lặp đi lặp lại như vậy.
                        => phần truyền dữ liệu từ vb xuống vdk thì như các bạn đã giải thích hết rồi, còn phần code của vdk (mình viết mãi mà ko xong) dùng mỗi RI để tạo ngắt nối tiếp có vẻ khó xử lý quá(với mình).
                        Mong các bạn chỉ bảo mình với.
                        Cảm ơn các bạn!
                        Thế nào là "có vẻ xử lí khó quá"? Caube đã làm chưa? Sơ đồ mạch đâu? mã chương trình đâu? Nếu làm thì nó chạy hay không chạy? Hiện tượng thế nào?
                        Bạn mà không nêu ra thì ... mọi người cũng ... thôi vậy!
                        !e

                        Comment


                        • #13
                          Nặng lời quá bác Zemen à! Em viết rồi, nhưng phải dùng cả ngắt nối tiếp và thăm dò nữa thì mới chạy nên nhờ mọi người giúp đỡ thôi. Mạng chỗ em chậm quá nên ko post hình đc.
                          -Về phần cứng thì ai làm về lập trình giao tiếp nối tiếp đều biết mắc cổng com => max232 => 89c51, còn mắc led 7thanh với 89c51 là quá cơ bản rồi.
                          -Về phần mềm thì ai có ý tưởng gì thì làm ơn nói qua cho em cái thuật toán cũng được, em có thể tự viết đc chương trình. (Chỉ là thuật toán xử lý của VDk thôi)
                          Cảm ơn mọi người!

                          Comment


                          • #14
                            Nguyên văn bởi caube Xem bài viết
                            Cảm ơn các bạn đã nhiệt tình giúp đỡ. Mình có khúc mắc nhờ các bạn chỉ bảo đây, truyền nhận thì mình đã hiểu rồi, nhưng sử dụng mỗi ngắt nối tiếp thì có vẻ khó điều khiển quá các bạn nhỉ?
                            - Mình có con led 7 thanh kết nối với port1, và điều khiển cho đếm từ 1 => 9 bằng máy tính như sau:
                            - Trên vb mình có 2 nút: Nút 1 khi ấn thì led đếm từ 1 => 4 rồi lại quay về 1, cứ lặp đi lặp lại như vậy.
                            Nút 2 khi ấn thì led đếm từ 5 => 9 rồi lại quay về 5, lặp đi lặp lại như vậy.
                            => phần truyền dữ liệu từ vb xuống vdk thì như các bạn đã giải thích hết rồi, còn phần code của vdk (mình viết mãi mà ko xong) dùng mỗi RI để tạo ngắt nối tiếp có vẻ khó xử lý quá(với mình).
                            Mong các bạn chỉ bảo mình với.
                            Cảm ơn các bạn!
                            cách của mình thế này:
                            sử dụng ngắt của Port nối tiếp, khi có ngắt thì làm như sau: trước tiên kiểm tra xem ký tự truyền từ PC xuống có phải 1 không? nếu không thì kiểm tra có phải là 2 không? nếu không nữa thì chẳng làm gì cả

                            nếu là 1:
                            đưa con trở DPTR vào bitmap1 (bitmap1 chủa mã hiển thị từ 1-->4) rồi thoát khoải ngắt.
                            nếu là 2:
                            đưa con trỏ DPTR vào bitmap2 (bitmap2 chứa mã hiển thị từ 5-->9) rồi thoát khỏi ngắt.

                            chương trình chính bạn chỉ cần khởi tạo ngắt cho Port nối tiếp, sau đó cho hiển thị kí tự tắt led (tùy phần cứng mà có thể là 00h, hoặc FFh)
                            khi có ngắt và ký tự thích hợp thì khi đó sẽ hiển thị được thôi.

                            main:
                            khởi tạo port nối tiếp
                            mov dptr,#bitmap ; bitmap này toàn là 00 hoặc là FFh
                            quay_lai: mov a,#0;
                            mov r0,#4
                            loop: movc a,@a+dptr
                            mov p1,a
                            delay(1s)
                            inc a
                            djnz r4,loop
                            jmp quay_lai
                            hãy cố gắng dù vướn phải thất bại!!!!!!!!

                            Comment


                            • #15
                              Nguyên văn bởi caube Xem bài viết
                              Nặng lời quá bác Zemen à! Em viết rồi, nhưng phải dùng cả ngắt nối tiếp và thăm dò nữa thì mới chạy nên nhờ mọi người giúp đỡ thôi. Mạng chỗ em chậm quá nên ko post hình đc.
                              -Về phần cứng thì ai làm về lập trình giao tiếp nối tiếp đều biết mắc cổng com => max232 => 89c51, còn mắc led 7thanh với 89c51 là quá cơ bản rồi.
                              -Về phần mềm thì ai có ý tưởng gì thì làm ơn nói qua cho em cái thuật toán cũng được, em có thể tự viết đc chương trình. (Chỉ là thuật toán xử lý của VDk thôi)
                              Cảm ơn mọi người!
                              Đó, tớ hỏi vậy bạn mới nói rõ, mới có trao đổi. Bài toán của bạn không khó, có lẽ bạn còn vướng mắc ở vấn đề giao tiếp cổng nối tiếp thôi.
                              Bạn cần thuật toán a, bạn có thể xem thêm cái này:



                              ví dụ: trên máy tính, nhấn nút 1 thì MSCOMM1.output = '1', nhấn nút 2 thì truyền MSCOMM1.output = '2'.
                              Ở vdk, cần phải viết 1 ch.trình ngắt nối tiếp để nhận dữ liệu tương ứng, talưu vào k.lệnh (k.lệnh = SBUF)
                              Ở ch.trình chính, ta sẽ có 2 biến đếm k.đếm 1 (tăng từ 1->5) và k.đếm 2 (tăng từ 6 -> 9) sau mỗi một khoảng thời gian.
                              Khi quét led thì kiểm tra lại k.lệnh để quét led với dữ liệu tương ứng.
                              !e

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X