1

シリアル ポートに PIC 16F887A を接続しています。0x01 を受信すると緑色の LED を点灯させ、PC から 0x00 を受信すると赤色の LED を点灯させます。C# Windows フォーム アプリケーションから文字を送信します。PIC 自体は CCS C でプログラムされています。以下のコードが機能しないため、何が間違っているのか教えてください。

編集:動作しないということは、どちらの場合も赤いLEDが点灯することを意味します。

C# コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;

namespace deneme
{
    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
        public Form1()
        {
            InitializeComponent();
        }

        private void openportbtn_Click(object sender, EventArgs e)
        {
            if (port.IsOpen)
            {
                port.Close();
            }

            if (!port.IsOpen)
            {
                port.Open();
            }
        }

        private void rightbtn_Click(object sender, EventArgs e)
        {
            byte[] right = new byte[1];
            right[0] = 0x01;
            port.Write(right, 0, right.Length);
        }

        private void wrongbtn_Click(object sender, EventArgs e)
        {
            byte[] wrong = new byte[1];
            wrong[0] = 0x00;
            port.Write(wrong, 0, wrong.Length);
        }
    }
}

CCS C コード

#include <16f877A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8)

char received;
char right = 0x01;

#int_rda
void serial_interrupt()
{
   disable_interrupts(int_rda);
   received = getc();
   if(received == right)
   {
      output_high(pin_c5); //green led
      delay_ms(200);
      output_low(pin_c5);
   }
   else
   {
      output_high(pin_c4); //red led
      delay_ms(200);
      output_low(pin_c4);
   }
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   output_low(pin_c4);
   output_low(pin_c5);

   enable_interrupts(GLOBAL);
   while(1)
   {
      enable_interrupts(int_rda);
   }
}
4

1 に答える 1

1

両方のケースで 0x00 を受信した場合は、ボー レートのミスマッチがわずかなミスマッチである可能性があります。開始ビットを検出した後、PIC は最初の 7 つのゼロを見て、8 を見たと考え、どちらの場合も 0x00 にします。PIC と PC から送信し、スコープで回線を監視して、同じ速度で実行されていることを確認します。0xAA を連続して送信してアイ パターン (10101010) を取得し、2 つの信号を比較することもできます。

于 2012-05-03T04:18:03.433 に答える