J'ai un PIC 16F887A connecté au port série. Je veux qu'il allume une led verte quand il reçoit 0x01 et allume une led rouge quand il reçoit 0x00 de pc. J'envoie les caractères d'une application C# Windows Forms, le PIC lui-même est programmé avec CCS C. Pouvez-vous s'il vous plaît me dire ce que je fais mal comme les codes ci-dessous ne fonctionnent pas?Port série C# + Port série CCS C + PIC 16F877A
Editer: Par ne fonctionne pas, je veux dire qu'il lit la led rouge dans les deux cas.
code 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 Code de
#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);
}
}
Quelle valeur recevez-vous réellement dans le «bon» cas? Que se passe-t-il si vous changez le test à "if (received! = 0)" au lieu de "if (received == right)"? – MiMo
J'utilise la simulation Proteus ISIS (avec des pilotes de port série virtuels). Dans le "bon" cas je vois 01 au terminal virtuel Proteus mais il coule toujours le rouge. Et cela fonctionne maintenant correctement quand j'utilise if (reçu! = 0) dans le code C, merci. Le code original semble également légitime mais pourquoi ne fonctionne-t-il pas correctement, aucune idée? – Omerta
Peut-être que les bits sont lus dans l'ordre inverse - donc vous envoyez '0x01' et recevez' 0x80', ou il y a un problème avec la parité, donc vous envoyez '0x01' et recevez' 0x02' parce que le bit de parité a décalé tout .. Cela fait longtemps que j'ai travaillé avec des ports série, mais je me souviens qu'ils peuvent être difficiles – MiMo