2011-10-24 18 views
6

लिखने और पढ़ने के लिए सी नहीं मिल सकता है यह मेरा पहला सी प्रोग्राम है। नमस्ते दुनिया! मुझे यकीन है कि इन दिनों हाईस्कूल प्रोग्रामर के लिए कोई समस्या नहीं है, लेकिन जब मैं हाईस्कूल में था तब उनके पास प्रोग्रामिंग नहीं थी। :)सी को सीरियल पोर्ट

मैं जब तक स्ट्रिंग मैं लिखने मेरे पास वापस गूँजती है एक सीरियल पोर्ट के लिए लिखना चाहते हैं। फिर अन्य सामान करो। नीचे मेरा कोड कुछ सेकंड के लिए चलता है और फिर स्ट्रिंग और सिरों को देखने का दावा करता है, भले ही यह वास्तव में स्ट्रिंग को नहीं देख सका। इससे कोई फर्क नहीं पड़ता कि इससे कोई फर्क नहीं पड़ता, मुझे स्पष्ट रूप से कुछ गलत लगता है।

हां, सीरियल डिवाइस/देव/बिल्ली के बच्चे वास्तविक हैं और टर्मिनल से, बैच को पोर्ट करते समय सीरियल पोर्ट पर/dev/kittens को प्रतिध्वनि (echoed) को स्पर्श किया जाता है।

मैं किसी को जो मेरी गलतियों को सही कर सकता करने के लिए सबसे सराहना होगी।

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <termios.h> 


int fd; 
char *buff; 



int open_port(void) 
{ 

fd = open("/dev/kitens", O_RDWR | O_NOCTTY | O_NDELAY); 
if (fd == -1) 
{ 
    perror("open_port: Unable to open /dev/kittens "); 
} 
    else 
    fcntl(fd, F_SETFL, 0); 

return (fd); 
} 



int main() 
{ 
int wr,rd; 
open_port(); 

char msg[]="There are mice in the wire.\r"; 


do 
{ 
/* Read from the port */ 
fcntl(fd, F_SETFL, FNDELAY); 
rd=read(fd,buff,sizeof(msg)); 

/* Write to the port */ 
wr = write(fd, msg, sizeof(msg)); 
printf("debugging - Wrote to port\n"); 
usleep(10000); 

if (wr < 0) { 
    fputs("write() to port /dev/kittens failed!\n", stderr); 
    break; 
      } 
} while (buff != msg); 

if (buff=msg) 
printf(buff, "String Found! Now do the work."); 
/* 
system("dostuff.sh); 
*/ 

/* Close the port on exit. */ 
close(fd); 

return 0; 
} 
+0

अकेले बिल्ली के बच्चे के लिए +1 कोड फिक्सिंग शुरू करने के लिए है! – vines

+1

'ओपन() ''/dev/kitens' का उपयोग करने के लिए आपका कॉल। क्या यह एक टाइपो है? –

+0

हां। यह मेरी पोस्ट में एक टाइपो था। धन्यवाद। –

उत्तर

8

पहले,

if (buff=msg) 

काम, नहीं तुलना :) बाद == है।

दूसरा,

if (buff == msg) 

वास्तव में सूचक तुलना, नहीं स्ट्रिंग तुलना है। स्ट्रिंग तुलना के लिए, सी मानक पुस्तकालय से strcmp() देखें।

तीसरा,

char *buff; 
... 
rd=read(fd,buff,sizeof(msg)); 

buff अप्रारंभीकृत छोड़ दिया है - कोई स्मृति इसके लिए आवंटित है, तो आपके पास पर्याप्त खुश यह बिल्कुल क्रैश नहीं होता हो।

ठीक है, वहाँ जाँच करने के लिए और अधिक है, लेकिन ऊपर सूचीबद्ध पहले से ही सही ढंग से कार्य से कार्यक्रम को रोकने के लिए पर्याप्त है।

एक सलाह के रूप में: read लाइन के नीचे एक डिबगिंग printf डालने का प्रयास करें ताकि वास्तव में पोर्ट से क्या पढ़ा जा सके। और याद रखें, बंदरगाह से पढ़े गए डेटा को शून्य-समाप्त होने की गारंटी नहीं है (संदर्भ के लिए zero-terminated strings देखें), इसलिए आपको इसके लिए भी देखना होगा (या तो वास्तविक डेटा के बाद शून्य जोड़ें, या किसी भी तरह बफर पर स्ट्रिंग ऑपरेशन सीमित करें , strcmp() के बजाय strncmp() का उपयोग करना)।

+0

जब तक मैंने तुम्हारा देखा तब तक मैं वही बात करने वाला था। टच – gkiar

+1

लेकिन वह वास्तव में क्या चाहता है वह है 'अगर (strncmp (msg, buff, strlen (msg)) == 0) ' –

+0

iKiar: =) @ ott--: right। मैंने अभी संकेत दिया है कि आदमी कहां देख रहा है, क्योंकि आदमी पढ़ रहा है :) – vines

0

इस कोड काम नहीं करेगा:

while (buff != msg); 

में दिलचस्पी रखने और संदेश संकेत दिए गए हैं। आप == या! = का उपयोग कर तारों की तुलना नहीं कर सकते हैं। आपको strcmp()

0

का उपयोग करना होगा जहां dos buff इंगित करें? यह शुरू नहीं हुआ है।

साथ ही, याद रखें कि सी में आप == का उपयोग करके तारों की तुलना नहीं कर सकते हैं, या आप तारों के पते की तुलना करेंगे। और कोई = या तो असाइनमेंट है। तारों की तुलना करने के लिए strcmp या memcmp का उपयोग करें यदि अंत में कोई एनयूएल वर्ण नहीं है और लंबाई ज्ञात है।

3

मैं कई त्रुटियों को देखने के:

  • तुम हमेशा त्रुटियों के लिए वापसी मान की जाँच करनी चाहिए। आपका open_port फ़ंक्शन -1 वापस लौटा सकता है अगर यह पोर्ट नहीं खोल सका, फिर भी आप मुख्य पाश में जारी रखते हैं।
  • आप रीड से रिटर्न की जांच नहीं करते हैं, यह -1 हो सकता है, इसलिए संभव है कि आप फ़ाइल पर एनडीईएल सेट करें।
  • आप buf को प्रारंभ नहीं करते हैं, यह कहीं भी इंगित करता है कि आप नहीं जानते हैं क्योंकि यह प्रारंभ नहीं हुआ है। आप char buffer[1024] या इस तरह कुछ उपयोग करना चाह सकते हैं।
  • सी में, दो स्ट्रिंग की तुलना strcmp का उपयोग करके किया जाता है, memcmp का उपयोग कर स्मृति। आप दो पॉइंटर्स की तुलना कर रहे हैं, न कि उनकी सामग्री।

मुझे लगता है कि यह पर्याप्त आप :-)

संबंधित मुद्दे