C#串行端口+;CCS C串行端口+;图16F877A

C#串行端口+;CCS C串行端口+;图16F877A,c#,c,serial-port,pic,C#,C,Serial Port,Pic,我有一个PIC16F887A连接到串行端口。我希望它在接收到0x01时点亮一个绿色led,在从pc接收到0x00时点亮一个红色led。我从C#windows窗体应用程序发送字符,PIC本身是用CCS C编程的。你能告诉我我做错了什么,因为下面的代码不工作吗 编辑:不工作,我的意思是在这两种情况下它都是红色的led灯 C#代码 CCS C代码 #include <16f877A.h> #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,N

我有一个PIC16F887A连接到串行端口。我希望它在接收到0x01时点亮一个绿色led,在从pc接收到0x00时点亮一个红色led。我从C#windows窗体应用程序发送字符,PIC本身是用CCS C编程的。你能告诉我我做错了什么,因为下面的代码不工作吗

编辑:不工作,我的意思是在这两种情况下它都是红色的led灯

C#代码

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);
   }
}
#包括
#保险丝XT、NOWDT、NOPROTECT、NOBROWNOUT、NOLVP、NOPUT、NOWRT、NODEBUG、NOCPD
#使用延迟(时钟=4000000)
#使用rs232(波特率=9600,xmit=pin_c6,rcv=pin_c7,奇偶校验=N,停止=1,位=8)
收到的字符;
char right=0x01;
#内塔
无效串行_中断()
{
禁用中断(int_rda);
received=getc();
如果(接收==正确)
{
输出高电平(引脚c5);//绿色led
延时μms(200);
输出低(引脚c5);
}
其他的
{
输出高电平(引脚c4);//红色led
延时μms(200);
输出低(引脚c4);
}
}
void main()
{
设置psp(psp禁用);
设置定时器1(禁用T1定时器);
设置定时器2(T2定时器禁用,0,1);
设置adc端口(无模拟);
设置adc(adc关闭);
设置CCP1(CCP1关闭);
设置CCP2(CCP2关闭);
输出低(引脚c4);
输出低(引脚c5);
启用_中断(全局);
而(1)
{
启用中断(int_rda);
}
}

如果它在两种情况下都接收到0x00,则很可能是波特率不匹配,甚至是轻微的不匹配。在检测到起始位后,PIC可能看到前7个零,并认为它看到了8个,在这两种情况下都是0x00。我会试着从PIC和PC上传输,并在示波器上观察线路,以确保它们以相同的速度运行。您还可以尝试连续发送0xAA以获得眼图(10101010)并比较两个信号。

如果它在两种情况下都接收0x00,则很可能存在波特率不匹配,即使是轻微的不匹配。在检测到起始位后,PIC可能看到前7个零,并认为它看到了8个,在这两种情况下都是0x00。我会试着从PIC和PC上传输,并在示波器上观察线路,以确保它们以相同的速度运行。您还可以尝试连续发送0xAA以获得眼图(10101010)并比较这两个信号。

在“正确”的情况下,您实际接收到哪个值?如果将测试更改为
if(received!=0)
而不是
if(received==right)
,会发生什么情况?我使用的是Proteus ISIS模拟(带有虚拟串行端口驱动程序)。在“右边”的情况下,我在Proteus虚拟终端上看到01,但它仍然是红色的。现在,当我在C代码中使用if(received!=0)时,它可以正常工作,谢谢。原始代码似乎也是合法的,但它为什么不能正常工作呢,有什么想法吗?可能位的读取顺序相反-因此您发送
0x01
并接收
0x80
,或者奇偶校验有问题,因此,您发送
0x01
并接收
0x02
,因为奇偶校验位移位了所有内容…我已经很久没有使用串行端口了,但我记得它们可能很复杂UART上的位顺序定义得很好,所以这不会是一个问题。pic仅正确地作用于0x00,所以我想您是对的。如果我找到了问题的原因或者找到了解决方案,我会把它贴在这里。谢谢你的帮助。在“正确”的情况下,你实际得到了什么价值?如果将测试更改为
if(received!=0)
而不是
if(received==right)
,会发生什么情况?我使用的是Proteus ISIS模拟(带有虚拟串行端口驱动程序)。在“右边”的情况下,我在Proteus虚拟终端上看到01,但它仍然是红色的。现在,当我在C代码中使用if(received!=0)时,它可以正常工作,谢谢。原始代码似乎也是合法的,但它为什么不能正常工作呢,有什么想法吗?可能位的读取顺序相反-因此您发送
0x01
并接收
0x80
,或者奇偶校验有问题,因此,您发送
0x01
并接收
0x02
,因为奇偶校验位移位了所有内容…我已经很久没有使用串行端口了,但我记得它们可能很复杂UART上的位顺序定义得很好,所以这不会是一个问题。pic仅正确地作用于0x00,所以我想您是对的。如果我找到了问题的原因或者找到了解决方案,我会把它贴在这里。感谢您的帮助。另一个选择是连接PIC的rx和tx引脚,并从PIC本身发送0和1,看看是否可以打开和关闭正确的LED。如果不能,说明PIC的程序有问题。另一个选项是连接PIC的rx和tx引脚,并从PIC本身发送0和1,看看它是否能打开和关闭右侧LED。如果不能,PIC的程序就有问题了。
#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);
   }
}