2014-4-30 13:55:06 [显示全部楼层]
11080浏览
查看: 11080|回复: 8

Arduino与C#串口通信的问题

[复制链接]
复制代码

背景说明:
       互动多媒体程序是用C#写的,Arduino只负责发送四个值,A,B,C,D。不接受任何来自C#程序的值。使用的板子是 Arduino ATMEGA328 或者ATMEGA2560,均为淘宝山寨板。Arduino烧录的代码如下:

  1. unsigned long time;
  2. int KeyA=0;
  3. int KeyB=0;
  4. int KeyA_Flag = 1;
  5. int KeyB_Flag = 1;
  6. int Hall1_Flag=1;
  7. int Hall2_Flag=1;
  8. int HallSensor1=1;
  9. int HallSensor2=1;
  10. void setup(){
  11. Serial.begin(9600);
  12. }
  13. void loop(){
  14. time = millis();
  15. if((time%180000) == 0)
  16. {
  17. //Serial.print("undo");
  18. // Serial.print("\n");
  19. }
  20. KeyA = digitalRead(4);
  21. KeyB = digitalRead(5);
  22. HallSensor1 = digitalRead(2);
  23. HallSensor2 = digitalRead(3);
  24. while(KeyA == 1)
  25. {
  26. KeyA = digitalRead(4);
  27. if(KeyA == 1)
  28. KeyA_Flag = 1;
  29. else KeyA_Flag = 0;
  30. }
  31. if(KeyA_Flag==0){
  32. KeyA_Flag = 1;
  33. Serial.print("A");
  34. delay(500);
  35. }
  36. while(KeyB==1){
  37. KeyB=0;
  38. Serial.print("B");
  39. delay(500);
  40. }
  41. while(HallSensor1==0){
  42. HallSensor1=digitalRead(2);
  43. if(HallSensor1==0)
  44. Hall1_Flag=1;
  45. else Hall1_Flag=0;
  46. }
  47. if(Hall1_Flag==0){
  48. Hall1_Flag=1;
  49. Serial.print("C");
  50. // delay(500);
  51. }
  52. while(HallSensor2==0){
  53. HallSensor2=digitalRead(3);
  54. if(HallSensor2==0)
  55. Hall2_Flag=1;
  56. else Hall2_Flag=0;
  57. }
  58. if(Hall2_Flag==0){
  59. Hall2_Flag=1;
  60. Serial.print("D");
  61. // delay(500);
  62. }
  63. }
复制代码

遇到的状况是:
      arduino-1.03下模拟测试一点问题都没有。但是在C#程序下,在按AB,C,D值切换的时候很容易造成程序死机,而退出程序后重新打开程序后就OK了。
  
今天测试的时候发现一个情况,说明如下:
ATMEGA328板子,正常情况下,往C#传值的时候,Arduino板子上的TX指示灯会闪一下。在arduino-1.0.3软件的模拟下一切正常。
但是在C#程序中会出现 L指示灯(闪红灯)跟TX指示灯同时闪的情况,而且当A,B通信几次后就程序死机,再按A,BTX灯也不闪了。退出C#程序后再运行的时候TX指示灯会闪烁一下(绿灯)。程序可以正常运行。
将板子换成ATMEGA2560后,L指示灯偶尔会闪黄灯,测试C#程序没有死机的情况,但偶尔会报“0X7c930cee"的内存错误。出现的几率比死机的情况低一半。再按A,B按钮TX指示灯正常闪烁。
请大神们指点,问题出在哪里,是板子芯片不稳定呢还是我的程序有问题,内存开销不够造成的死机?或者是其他问题,谢谢!
QQ图片20140430110153.jpg

Ricky  NPC

发表于 2014-4-30 16:11:07

先用Arduino自带IDE的串口监视器看看 数据是否显示正常。  

如果这个正常,那就是C#程序问题了。  
回复

使用道具 举报

Ricky  NPC

发表于 2014-4-30 16:11:54

另外Arduino程序中,加个delay(100);
回复

使用道具 举报

lyhlyly  学徒
 楼主|

发表于 2014-5-4 09:50:42

Ricky 发表于 2014-4-30 16:11
另外Arduino程序中,加个delay(100);

谢谢你的回复,问题不在这里。今天收到意大利原版的UDO板子,经测试没有死机的情况,跟ATMEGA2560出现的报错情况一样。这么说山寨板子还是有一定问题。剩下的内存报错问题,我从系统跟程序上着手找找!
回复

使用道具 举报

lyhlyly  学徒
 楼主|

发表于 2014-5-4 09:56:59

Ricky 发表于 2014-4-30 16:11
先用Arduino自带IDE的串口监视器看看 数据是否显示正常。  

如果这个正常,那就是C#程序问题了。   ...

用Arduino自带IDE的串口监视器看,是正常的,但是一开程序测就出问题了,板子的TX指示灯也有变化。C#程序数据传输方面 可能有一定问题。
回复

使用道具 举报

Ricky  NPC

发表于 2014-5-4 10:47:24

lyhlyly 发表于 2014-5-4 09:50
谢谢你的回复,问题不在这里。今天收到意大利原版的UDO板子,经测试没有死机的情况,跟ATMEGA2560出现的 ...

没有delay串口会堵塞。  最好加点delay,会稳定很多。 另外可已把

Serial.begin(9600) 改成  Serial.begin(115200)
回复

使用道具 举报

lyhlyly  学徒
 楼主|

发表于 2014-5-4 11:50:20

Ricky 发表于 2014-5-4 10:47
没有delay串口会堵塞。  最好加点delay,会稳定很多。 另外可已把

Serial.begin(9600) 改成  Serial.beg ...

改了行代码:清串口缓存,
串口比特率是跟C#统一的。delay 后边两个被我注释掉了,因为每次出问题都出在串口输出A,B上,C,D没有问题。
if((time%1000) == 0)

{
Serial.flush();
//Serial.print("undo");

// Serial.print("\n");

}

另外还有个问题请教下:一般的按钮,按照我贴出的代码,输出A的代码  在按钮按下跟弹起都会有输出,输出B的代码 在按钮按下不放的情况下一直会有输出B,好像这个问题只能通过delay 加时间间隔解决。
回复

使用道具 举报

Ricky  NPC

发表于 2014-5-4 14:27:06

可以参考这个代码:

  1. /*
  2. Debounce
  3. Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
  4. press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
  5. a minimum delay between toggles to debounce the circuit (i.e. to ignore
  6. noise).  
  7. The circuit:
  8. * LED attached from pin 13 to ground
  9. * pushbutton attached from pin 2 to +5V
  10. * 10K resistor attached from pin 2 to ground
  11. * Note: On most Arduino boards, there is already an LED on the board
  12. connected to pin 13, so you don't need any extra components for this example.
  13. created 21 November 2006
  14. by David A. Mellis
  15. modified 30 Aug 2011
  16. by Limor Fried
  17. This example code is in the public domain.
  18. http://www.arduino.cc/en/Tutorial/Debounce
  19. */
  20. // constants won't change. They're used here to
  21. // set pin numbers:
  22. const int buttonPin = 2;     // the number of the pushbutton pin
  23. const int ledPin =  13;      // the number of the LED pin
  24. // Variables will change:
  25. int ledState = HIGH;         // the current state of the output pin
  26. int buttonState;             // the current reading from the input pin
  27. int lastButtonState = LOW;   // the previous reading from the input pin
  28. // the following variables are long's because the time, measured in miliseconds,
  29. // will quickly become a bigger number than can be stored in an int.
  30. long lastDebounceTime = 0;  // the last time the output pin was toggled
  31. long debounceDelay = 50;    // the debounce time; increase if the output flickers
  32. void setup() {
  33.   pinMode(buttonPin, INPUT);
  34.   pinMode(ledPin, OUTPUT);
  35. }
  36. void loop() {
  37.   // read the state of the switch into a local variable:
  38.   int reading = digitalRead(buttonPin);
  39.   // check to see if you just pressed the button
  40.   // (i.e. the input went from LOW to HIGH),  and you've waited
  41.   // long enough since the last press to ignore any noise:  
  42.   // If the switch changed, due to noise or pressing:
  43.   if (reading != lastButtonState) {
  44.     // reset the debouncing timer
  45.     lastDebounceTime = millis();
  46.   }
  47.   
  48.   if ((millis() - lastDebounceTime) > debounceDelay) {
  49.     // whatever the reading is at, it's been there for longer
  50.     // than the debounce delay, so take it as the actual current state:
  51.     buttonState = reading;
  52.   }
  53.   
  54.   // set the LED using the state of the button:
  55.   digitalWrite(ledPin, buttonState);
  56.   // save the reading.  Next time through the loop,
  57.   // it'll be the lastButtonState:
  58.   lastButtonState = reading;
  59. }
复制代码
回复

使用道具 举报

nemon  中级技匠

发表于 2014-5-5 08:44:28

无论arduino如何,C#一定写的有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail