Seriporttan okunan anlamsız karakterler????

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

s.a. arkadaşlar.
hazırladığım bir programda seriporttan gelen bilgiler timer ile belirli aralıklarla okunup veritabanına kaydediliyor.
TSerialPort bileşenini kullanıyorum. Porttan okuma ve yazma ile ilgili bir problemim yok. Lakin bazı zamanlar (genelde sabahları) porttan değişik karakterler gelmekte. porta gönderilen verilerde (dışardaki bir cihazdan gelen veriler) bir problem görünmüyor. ancak okunan veriler anlamsız karakterler şeklinde görünüyor. programı kapatıp açıyorum, port bağlantısını kapatıp açıyorum düzelmiyor. Ancak hyperterminal ile bağlanıp gelen verileri gördükten sonra progradan bağlandığım zaman veriler düzgün bir şekilde geliyor.
aşağıda porttan okuduğum karakterler var...

Kod: Tümünü seç

28.08.2009 08.32.13 : ^~
Barkod numarası okunmamış
28.08.2009 08.32.28 : (^~
Barkod numarası okunmamış
28.08.2009 08.32.44 : ^h~
Barkod numarası okunmamış
28.08.2009 08.32.56 : (^~
Barkod numarası okunmamış
28.08.2009 08.33.14 : (^~
Barkod numarası okunmamış
28.08.2009 08.33.48 : ^~
Barkod numarası okunmamış
28.08.2009 08.34.10 : ^~
Barkod numarası okunmamış
28.08.2009 08.42.30 : h^~
Barkod numarası okunmamış
28.08.2009 08.43.24 : f~
Barkod numarası okunmamış
28.08.2009 08.43.38 : ^~
Barkod numarası okunmamış
tarih saat bilgisini ben ekliyorum log olarak ancak ":" den sonraki karakterler porttan gelen karakterler.
dediğim gibi hyper terminalden portu dinledikten sonra benim programda düzgün okumaya başlıyor.
sizce sorun ne olabilir.
Dosya ekleri
Serial.rar
Kullandığım Seri Port bileşeni....
(5.1 KiB) 241 kere indirildi
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen adelphiforumz »

s.a.

hocam bahsettiğine yakın bir problemi bende yaşadım en sonunda bulduğum bir komponentle sorunsuz çalışabildim.(Turbo Power AsyncProfessional)
belki yardımı olabilir diye yazıyorum ilk sorunu yaşadığımda yaptığım araştırmalarda baudrate ile ilgili olduğunu farkettim
Ayrıca gelen bilgiler belirli bir dizilim içinde ise [A..Z] [0..9] gibi, bunların dışında gelen bir bilgi varsa
recive işlemini durdurup, portu kapatıp, biraz bekledikten sonra(2 sn gibi) set baudrate işlemi yeniden yapıp, portu açtığımda sorunun düzeldiğini gördüm.
umarım işine yarar
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

a.s.
yalnız bir noktaya dikkatini çekmek istiyorum.
benim baudrate vs. ayarlar ile ilgili bir problemim yok.
program normal çalışıyor gelen bilgileri porttan okuyor.
gece porttan bilgi akışı olmuyor.
sabah gelen bilgilerde bir önceki mesajımda belirttiğim gibi değişik karakterler geliyor.
programı veya portu açkapa yapmak bir işe yaramıyor.
hyperterminali çalıştırıyorum. daha sonra benim programı açıyorum düzgün okumaya başlıyor.

acaba port uzun süre açık beklediği için yapıyor olabilirmi?
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aLonE CoDeR »

Aynı sorunu ben de yaşadım ve hala yaşıyorum. Birden fazla port bileşeni denedim (Turbo Power dahil) sonuç değişmedi. Farklı makinalarda derledim sonuç değişmedi. Hatta bazen şöyle garip bir tepki de veriyor, derlediğim makinada sorunsuz çalışırken başka bir makinada hiç işlem yapmıyor, bir başka makinada yine çalışıyor vs.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen comfort »

Hyperterminalde baktığınızda gene bozukmu gözüküyor onu anlamadım.
hyperterminalde karakterler düzgün gözüküyorsa sorun sizin yazılımdan kaynaklı. Bence TComport kullanın. Sorunsuz çalışıyor.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

hyperterminalden bakınca düzgün gösteriyor.
sıralama şu şekilde oluyor.

program gayet güzel çalışıyor.
akşam mesai bitiyor program çalışmaya devam ediyor ancak porttan herhangi bir veri gelmiyor(doğal olarak)
sabah mesai başladığı zaman porttan saçma veriler gelmeye başlıyor.
port aç kapa , programı aç kapa fayda etmiyor. porttan saçma veriler geliyor. port kapatılıyor.
hyper terminal açılıyor veriler düzgün görünüyor.
hyper terminal kapatılıyor.
programdan port tekrar açılıyor veriler düzgün bi şekilde geliyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

bu sabah gene aynı problem oldu.
portmon ile baktığım zaman hyperterminalin değişik bir yöntemile portu dinlediğini fakrettim.
porttan okuma işlemini başlatıyor, timeout a düşünce porttan gelen bilgileri gösteriyor.
ben ise porttan okuma yapıyorum. deger varsa alıyorum yoksa yapacak bişey yok zaten.
karakterler geldiği zaman ki log dosyasındada portta ilk mesajdakine benzer karakterler görünüyor.
log dosyasını aşağıya ekliyorum.

Kod: Tümünü seç

0	0.00005476	hypertrm.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
1	0.00000698	hypertrm.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 8192 OutSize: 8192	
2	0.00000168	hypertrm.exe	IOCTL_SERIAL_CONFIG_SIZE	Serial0	SUCCESS	Size: 0	
3	0.00000168	hypertrm.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
4	0.00000196	hypertrm.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
5	0.00000140	hypertrm.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
6	0.00000140	hypertrm.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
7	0.00000168	hypertrm.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
8	0.00000140	hypertrm.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
9	0.00000168	hypertrm.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
10	0.00000140	hypertrm.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
11	0.00000838	hypertrm.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
12	0.00000447	hypertrm.exe	IOCTL_SERIAL_SET_DTR	Serial0	SUCCESS		
13	0.00000307	hypertrm.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
14	0.00000196	hypertrm.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
15	0.00000335	hypertrm.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:80000009 Replace:80000080 XonLimit:80 XoffLimit:200	
16	0.00000168	hypertrm.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:10 RM:0 RC:0 WM:0 WC:5000	
17	0.00000251	hypertrm.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RLSD ERR 	
18	174.97213026	hypertrm.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
19	41.94666166	hypertrm.exe	IRP_MJ_READ	Serial0	TIMEOUT	Length 34: 5034648490447..90900062444449044..	
20	34.45505281	hypertrm.exe	IRP_MJ_READ	Serial0	TIMEOUT	Length 34: 5034648490447..90900063444449044..	
21	45.76816467	hypertrm.exe	IRP_MJ_READ	Serial0	TIMEOUT	Length 34: 5034648490447..90900552444449044..	
22	43.73681180	hypertrm.exe	IRP_MJ_READ	Serial0	TIMEOUT	Length 15: 5034648490447..	
23	9.06523734	hypertrm.exe	IRP_MJ_READ	Serial0	CANCELLED	Length 80	
24	0.00038329	hypertrm.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RLSD ERR 	
25	0.00000419	hypertrm.exe	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT RXABORT 	
26	0.00000531	hypertrm.exe	IRP_MJ_CLEANUP	Serial0	SUCCESS		
27	0.01562852	hypertrm.exe	IRP_MJ_CLOSE	Serial0	SUCCESS		
28	0.00036597	UUretimBarkod.e	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
29	0.00000307	UUretimBarkod.e	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
30	0.00000168	UUretimBarkod.e	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
31	0.00000168	UUretimBarkod.e	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
32	0.00000168	UUretimBarkod.e	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
33	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
34	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
35	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
36	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
37	0.00000894	UUretimBarkod.e	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
38	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
39	0.00000168	UUretimBarkod.e	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
40	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
41	0.00000140	UUretimBarkod.e	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
42	0.00000838	UUretimBarkod.e	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
43	0.00000447	UUretimBarkod.e	IOCTL_SERIAL_SET_DTR	Serial0	SUCCESS		
44	0.00000307	UUretimBarkod.e	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
45	0.00000196	UUretimBarkod.e	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
46	0.00000391	UUretimBarkod.e	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:80000009 Replace:80000080 XonLimit:2048 XoffLimit:512	
47	0.00000335	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
48	0.00000251	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
49	0.00000196	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
50	0.00000726	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
51	0.00000754	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
.......
  Burada SUCCESS satırları var
.......
67	0.00000810	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
68	0.00000475	UUretimBarkod.e	IRP_MJ_READ	Serial0	SUCCESS	Length 34: 5034648490447..90900064444449044..	
69	0.00000419	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
70	0.00000251	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
71	0.00000726	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
.......
80	0.00000754	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
81	0.00000559	UUretimBarkod.e	IRP_MJ_READ	Serial0	SUCCESS	Length 15: 5034648490447..	
82	0.00000419	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
83	0.00000251	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
104	0.00000782	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
105	0.00000726	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
.....
127	0.00000838	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
128	0.00000475	UUretimBarkod.e	IRP_MJ_READ	Serial0	SUCCESS	Length 34: 5034648490447..90900555444449044..	
129	0.00000447	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
130	0.00000251	UUretimBarkod.e	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
131	0.00000754	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
132	0.00000754	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
133	0.00000782	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
....
174	0.00000726	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
175	0.00000726	UUretimBarkod.e	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
dediğim gibi hyperterminal timeout olunca bilgiyi gösteriyor. yani logda timeout yazıyor ancak bilgi geldiği zaman hemen gösteriyor. gelen bilginin sonunda cr lf olduğu için yapıyor sanırsam.
neyse bu loglardan sorunun sebebi (veya çözümü) ile ilgili birşeyler söylemek isteyen olursa.....
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen adelphiforumz »

S.A.
Uzun zamandır personel giriş çıkış sistemleri yazıyorum ve bu işlemleri comportlar üzerinden hallerdiyorum
bazı müşterilerde program 2 ay 3 ay hiç kapanmıyor.
Turbo powerın componentini kullanıyorum ve bahsettiğiniz gibi bir sorun hiç yaşamadım.
Eğer sizin için sakıncası yoksa gelen datanın tam ne olduğunu gönderirseniz (özel karakterler dahil ve geliş sırasının önemi var)
ayrıca datayı gönderen cihazların bilgisi nedir.
küçük bir program yazıp size göndereyim. test etme şansınız varsa bir iki gün test edin.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen comfort »

Benim aklım ermedi bu işe. Çözerseniz cevanı buraya da yazarmısınız.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

@adelphiforumz; benimde daha önce hiç başıma gelmemişti böyle bir problem.
datayı gelişmiş bi barkod cihazı gönderiyor. modelini falan bilmiyorum ama yüzey taraması yapıyor bulduğu barkodlar içinde belli özellikte olanları comporttan bilgisayara gönderiyor. bende gelen dataları okuyup ona göre işlem yapıyorum. ama bazen ilk mesajda gönderdiğim karakterler geliyor. portmon ile baktığım zamanda gelen karakterler saçma sapan karakterler. işin ilginç tarafı hyperterminal okuyor sonrasında programda okuyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen adelphiforumz »

S.A.
Anlattıklarından benim anladığım sorun oluştuğunda hyperterminali açıp kapatınca herşey düzeliyor diyorsun bu noktadan sonra diyecek bir şey pek kalmıyor.
ben sadece şimdiye kadar yaşadığım sorunlarla ilgili başıma gelenleri paylaşayım belki bir faydası dokunur.
yine belirteyim eğer gelen datanın formatını belirtebilirsen küçük bir program yazar gönderirim.
özellikle işlemin başlangıç karakteri ve bitiş karakterlerinin önemi oldukça büyük butur uygulamalarda.

Barkodun bağlı olduğu elektrik hattının topraklaması ile bilgisayarın topraklaması düzgünmü.
bu problem datanın sürekli bozulmasına yol açıyor defalarca başıma geldi.

USB COM çevirici kullanıyorsan sorun yaşyabilirsin.
Özellikle Laptoplarda çeviricinin kendi driverını kullan işletim sisteminin bulduğu drivırı kullanma.

Markalı pclerde comportun kullandığı elektrik çok düzgün olmalı. zamanında markalı 3 adet pc ile çalışmayan sistemin toplama makinalarda çalıştığını çok gördüm. sorun çoğu zaman gelen elektrik hattının topraklamasında çıkıyor.

Bazı bilgisayarlarda Vista data alış verişinde sorun çıkarabiliyor.
aynı maikna üzerinde Xp ve Vista var Program xpde sorunsuz çalışıyor Vistaya geçtiğinde sorun başlıyor.

sana kolay gelsin
umarım bir an önce sorunun kaynağını tespit edebilirisn.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

a.s.
belirli bir format yok.
porttan string olarak barkod geliyor. bazen iki bazen 3 barkod (EAN 13 ve CODE28) geliyor. aralarında CR LF var.
hyper terminal portu dinlerken porttan veri gelene kadar bekliyor.
bizim yazdığımız uygulama ise portu sürekli kontrol ediyor varsa alıyor.
ikinci gönderdiğim listeye bakarsan 19..22 satırlarda hyperterminal timeout sonucunda bilgileri alıyor.(sanırım hyperterminalin normal çalışma şekli boyle) bizim uygulamda ise portta veri varsa alınıyor yoksa bir sonraki kontrol e kadar bekleniyor.
hyperterminal bunu nasıl yapıyor acaba....
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen quadr »

eğer hyperterminal düzgün okuyorsa donanımsal bir sonunuz yok demektir.
ilk olarak giriş çıkış bufferlarını temizle her okumada.
PurgeComm(FHandle, PURGE_RXABORT+PURGE_RXCLEAR);
PurgeComm(FHandle, PURGE_TXABORT+PURGE_TXCLEAR);

hyperterminal her read etmesinde buffer ın uzunluğukadar okur ekrana yansıtır.
sizin için en iyi okuma okunacak karakter sayısını belirtmektir.böylece stabil bir okuma elde etmiş olursunuz

örnek verilecek olunursa kendi unitim üzerinden vereyim.ha bu arada component kullanmayın.

unitte bulunan readstring function'u bufferused kadar okuma yapar bunu biraz değiştirirseniz bir count ve time out süresi ile düzenli bir
çalışma elde etmiş olursunuz.

Kod: Tümünü seç

function TSerialConnection.ReadString2(const Count: integer;
  const TimeOut: cardinal): string;
var
  T: cardinal;
begin
    Result := '';
  if Count = 0 then Exit;
  T := GetTickCount;
  repeat
    if InBufUsed >= Count then
    begin
      Result := ReadString(Count);
      Exit;
    end;

    if GetTickCount - T > TimeOut then
      Exit;

    Sleep(10);
  until False;
end;
kullanımı için uniti ekleyin bir variable tanımlayın.

FConnection: TSerialConnection;

daha sonra create edin

FConnection := TSerialConnection.Create(nil);

baud + parity + bit sayısı falan filan ayarlayın connect edin.

sonrada okuyun kafanıza göre....


Kod: Tümünü seç

unit CPD;

interface

uses
  Windows, SysUtils, Classes;

type
{ TSerialConnection }

  TComPort       = (cpCOM1, cpCOM2, cpCOM3, cpCOM4, cpCOM5, cpCOM6);
  TBaudRate      = (br110, br300, br600, br1200, br2400, br4800,
                    br9600, br14400, br19200, br38400, br56000,
                    br57600, br115200);
  TDataBits      = (db5BITS, db6BITS, db7BITS, db8BITS);
  TStopBits      = (sb1BITS, sb1HALFBITS, sb2BITS);
  TParity        = (ptNONE, ptODD, ptEVEN, ptMARK, ptSPACE);
  THwHandshaking = (hhNONE, hhRTSCTS);
  TSwHandshaking = (shNONE, shXONXOFF);

  TReadWriteEvent = procedure(Sender: TObject; const Data: string) of object;

  TSerialConnection = class(TComponent)
  private
    FHandle: THandle;
    FComPort: TComPort;
    FBaudRate: TBaudRate;
    FDataBits: TDataBits;
    FStopBits: TStopBits;
    FComPortParity: TParity;
    FHwHandshaking: THwHandshaking;
    FSwHandshaking: TSwHandshaking;
    FInBufSize: integer;
    FOutBufSize: integer;
    FReadIntervalTimeout: cardinal;
    FReadTotalTimeoutMultiplier: cardinal;
    FReadTotalTimeoutConstant: cardinal;
    FWriteTotalTimeoutMultiplier: cardinal;
    FWriteTotalTimeoutConstant: cardinal;
    FOnWrite: TReadWriteEvent;
    FOnRead: TReadWriteEvent;
    procedure SetComPort(const Value: TComPort);
    procedure SetBaudRate(const Value: TBaudRate);
    procedure SetDataBits(const Value: TDataBits);
    procedure SetStopBits(const Value: TStopBits);
    procedure SetParity(const Value: TParity);
    procedure SetHwHandshaking(const Value: THwHandshaking);
    procedure SetSwHandshaking(const Value: TSwHandshaking);
    procedure SetReadIntervalTimeout(const Value: cardinal);
    procedure SetReadTotalTimeoutMultiplier(const Value: cardinal);
    procedure SetReadTotalTimeoutConstant(const Value: cardinal);
    procedure SetWriteTotalTimeoutMultiplier(const Value: cardinal);
    procedure SetWriteTotalTimeoutConstant(const Value: cardinal);
    procedure SetInBufSize(const Value:integer);
    procedure SetOutBufSize(const Value:integer);
    procedure ApplySettings;
    function GetComStat: TComStat;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Connect; 	
    procedure Disconnect;
    function Connected: boolean;
    procedure WriteString(const S: string);
    function ReadString(Count: cardinal = 0): string;
    function ReadString2(const Count: integer; const TimeOut: cardinal): string;
    function InBufUsed: cardinal;
    function OutBufUsed: cardinal;
    procedure PurgeInBuf;
    procedure PurgeOutBuf;
    function RTSHigh: boolean;
    function RTSLow: boolean;
    function DTRHigh: boolean;
    function DTRLow: boolean;
    procedure SetBreakState(const Value: boolean);
    procedure Assign(Source: TPersistent); override;
    property Handle: THandle read FHandle;
  published
    property ComPort: TComPort read FComPort write SetComPort default cpCOM2;
    property Speed: TBaudRate read FBaudRate write SetBaudRate default br9600;
    property DataBits: TDataBits read FDataBits write SetDataBits default db8BITS;
    property StopBits: TStopBits read FStopBits write SetStopBits default sb1BITS;
    property Parity: TParity read FComPortParity write SetParity default ptNONE;
    property HwHandshaking: THwHandshaking read FHwHandshaking write SetHwHandshaking default hhNONE;
    property SwHandshaking: TSwHandshaking read FSwHandshaking write SetSwHandshaking default shNONE;
    property InBufSize: integer read FInBufSize write SetInBufSize default 2048;
    property OutBufSize: integer read FOutBufSize write SetOutBufSize default 2048;
    property ReadIntervalTimeout: cardinal read FReadIntervalTimeout write SetReadIntervalTimeout;
    property ReadTotalTimeoutMultiplier: cardinal read FReadTotalTimeoutMultiplier write SetReadTotalTimeoutMultiplier;
    property ReadTotalTimeoutConstant: cardinal read FReadTotalTimeoutConstant write SetReadTotalTimeoutConstant;
    property WriteTotalTimeoutMultiplier: cardinal read FWriteTotalTimeoutMultiplier write SetWriteTotalTimeoutMultiplier;
    property WriteTotalTimeoutConstant: cardinal read FWriteTotalTimeoutConstant write SetWriteTotalTimeoutConstant;
    property OnRead: TReadWriteEvent read FOnRead write FOnRead;
    property OnWrite: TReadWriteEvent read FOnWrite write FOnWrite;
  end;

implementation

procedure SCError;
begin
  raise Exception.Create('Serial Connection Error!'+#13#10+SysErrorMessage(GetLastError));
end;

{ TSerialConnection }

constructor TSerialConnection.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FHandle := INVALID_HANDLE_VALUE;
  FComPort := cpCOM1;
  FBaudRate := br9600;
  FDataBits := db8BITS;
  FStopBits := sb1BITS;
  FComPortParity := ptNONE;
  FHwHandshaking := hhNONE;
  FSwHandshaking := shNONE;
  FInBufSize := 2048;
  FOutBufSize := 2048;
  FReadIntervalTimeout := MAXDWORD;
  FReadTotalTimeoutMultiplier := 0;
  FReadTotalTimeoutConstant := 0;
  FWriteTotalTimeoutMultiplier := 0;
  FWriteTotalTimeoutConstant := 0;
end;

destructor TSerialConnection.Destroy;
begin
  if Connected then Disconnect;
  inherited Destroy;
end;

procedure TSerialConnection.Assign(Source: TPersistent);
begin
  if Source is TSerialConnection then
  begin
    ComPort                     := TSerialConnection(Source).ComPort;
    Speed                       := TSerialConnection(Source).Speed;
    DataBits                    := TSerialConnection(Source).DataBits;
    StopBits                    := TSerialConnection(Source).StopBits;
    Parity                      := TSerialConnection(Source).Parity;
    HwHandshaking               := TSerialConnection(Source).HwHandshaking;
    SwHandshaking               := TSerialConnection(Source).SwHandshaking;
    InBufSize                   := TSerialConnection(Source).InBufSize;
    OutBufSize                  := TSerialConnection(Source).OutBufSize;
    ReadIntervalTimeout         := TSerialConnection(Source).ReadIntervalTimeout;
    ReadTotalTimeoutMultiplier  := TSerialConnection(Source).ReadTotalTimeoutMultiplier;
    ReadTotalTimeoutConstant    := TSerialConnection(Source).ReadTotalTimeoutConstant;
    WriteTotalTimeoutMultiplier := TSerialConnection(Source).WriteTotalTimeoutMultiplier;
    WriteTotalTimeoutConstant   := TSerialConnection(Source).WriteTotalTimeoutConstant;
  end
  else inherited Assign(Source);
end;

procedure TSerialConnection.PurgeInBuf;
begin
  if not PurgeComm(FHandle, PURGE_RXABORT+PURGE_RXCLEAR) then SCError;
end;

procedure TSerialConnection.PurgeOutBuf;
begin
  if not PurgeComm(FHandle, PURGE_TXABORT+PURGE_TXCLEAR) then SCError;
end;

procedure TSerialConnection.SetComPort(const Value: TComPort);
begin
  if Value <> FComPort then
  begin
    if Connected then Disconnect;
    FComPort := Value;
  end;
end;

procedure TSerialConnection.SetBaudRate(const Value: TBaudRate);
begin
  FBaudRate := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetDataBits(const Value: TDataBits);
begin
  FDataBits := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetStopBits(const Value: TStopBits);
begin
  FStopBits := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetParity(const Value: TParity);
begin
  FComPortParity := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetHwHandshaking(const Value: THwHandshaking);
begin
  FHwHandshaking := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetInBufSize(const Value:integer);
begin
  FInBufSize := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetOutBufSize(const Value:integer);
begin
  FOutBufSize := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetSwHandshaking(const Value: TSwHandshaking);
begin
  FSwHandshaking := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetReadIntervalTimeout(const Value: cardinal);
begin
  FReadIntervalTimeout := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetReadTotalTimeoutMultiplier(const Value: cardinal);
begin
  FReadTotalTimeoutMultiplier := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetReadTotalTimeoutConstant(const Value: cardinal);
begin
  FReadTotalTimeoutConstant := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetWriteTotalTimeoutMultiplier(const Value: cardinal);
begin
  FWriteTotalTimeoutMultiplier := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.SetWriteTotalTimeoutConstant(const Value: cardinal);
begin
  FWriteTotalTimeoutConstant := Value;
  if Connected then ApplySettings;
end;

procedure TSerialConnection.ApplySettings;
const
  Win32BaudRates: array[br110..br115200] of DWORD =
    (CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600,
     CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200);

  DCB_Binary              = $00000001;
  DCB_ParityCheck         = $00000002;
  DCB_OutxCtsFlow         = $00000004;
  DCB_OutxDsrFlow         = $00000008;
  DCB_DtrControlMask      = $00000030;
  DCB_DtrControlDisable   = $00000000;
  DCB_DtrControlEnable    = $00000010;
  DCB_DtrControlHandshake = $00000020;
  DCB_DsrSensivity        = $00000040;
  DCB_TXContinueOnXoff    = $00000080;
  DCB_OutX                = $00000100;
  DCB_InX                 = $00000200;
  DCB_ErrorChar           = $00000400;
  DCB_NullStrip           = $00000800;
  DCB_RtsControlMask      = $00003000;
  DCB_RtsControlDisable   = $00000000;
  DCB_RtsControlEnable    = $00001000;
  DCB_RtsControlHandshake = $00002000;
  DCB_RtsControlToggle    = $00003000;
  DCB_AbortOnError        = $00004000;
  DCB_Reserveds           = $FFFF8000;

var
  DCB: TDCB;
  TMS: TCOMMTIMEOUTS;
begin
  if not Connected then Exit;
  FillChar(DCB, SizeOf(DCB), 0);
  DCB.DCBLength := SizeOf(DCB);
  DCB.BaudRate := Win32BaudRates[FBaudRate];
  DCB.Flags := DCB_Binary or DCB_DtrControlEnable;
  case FHwHandshaking of
    hhNONE   : ;
    hhRTSCTS : DCB.Flags := DCB.Flags or DCB_OutxCtsFlow or DCB_RtsControlHandshake;
  end;
  case FSwHandshaking of
    shNONE     : ;
    shXONXOFF  : DCB.Flags := DCB.Flags or DCB_OutX or DCB_InX;
  end;
  DCB.XONLim := FInBufSize div 4;
  DCB.XOFFLim := 1;
  DCB.ByteSize := 5 + Ord(FDataBits);
  DCB.Parity := Ord(FComPortParity);
  DCB.StopBits := Ord(FStopBits);
  DCB.XONChar := #17;
  DCB.XOFFChar := #19;
  SetCommState(FHandle, DCB);
  SetupComm(FHandle, FInBufSize, FOutBufSize);
  FillChar(TMS, SizeOf(TMS), 0);
  TMS.ReadIntervalTimeout := FReadIntervalTimeout;
  TMS.ReadTotalTimeoutMultiplier := FReadTotalTimeoutMultiplier;
  TMS.ReadTotalTimeoutConstant := FReadTotalTimeoutConstant;
  TMS.WriteTotalTimeoutMultiplier := FWriteTotalTimeoutMultiplier;
  TMS.WriteTotalTimeoutConstant := FWriteTotalTimeoutConstant;
  SetCommTimeOuts(FHandle, TMS);
end;

procedure TSerialConnection.Connect;
var
  ComName: array[0..4] of Char;
begin
  if Connected then Exit;
  StrPCopy(ComName, 'COM');
  ComName[3] := Chr(Ord('1') + Ord(FComPort));
  ComName[4] := #0;
  FHandle := CreateFile(ComName,
                        GENERIC_READ or GENERIC_WRITE,
                        0,
                        nil,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        0) ;
  if not Connected then SCError;
  ApplySettings;
end;

procedure TSerialConnection.Disconnect;
begin
  CloseHandle(FHandle);
  FHandle := INVALID_HANDLE_VALUE;
end;

function TSerialConnection.Connected: boolean;
begin
  Result := FHandle <> INVALID_HANDLE_VALUE;
end;

procedure TSerialConnection.WriteString(const S: string);
var
  BytesTransferred: cardinal;
begin
  if not WriteFile(FHandle, S[1], Length(S), BytesTransferred, nil) then SCError;
  if Assigned(FOnWrite) then
    FOnWrite(Self, S);
end;

function TSerialConnection.ReadString(Count: cardinal = 0): string;
var
  BytesTransferred: cardinal;
begin
  if Count = 0 then
    Count := InBufUsed;
  SetLength(Result, Count);
  if not ReadFile(FHandle, Result[1], Length(Result), BytesTransferred, nil) then SCError;
  SetLength(Result, BytesTransferred);
  if Assigned(FOnRead) then
    FOnRead(Self, Result);
end;

function TSerialConnection.GetComStat: TComStat;
var
  ComStat : TComStat;
  Errors : cardinal;
begin
  if not ClearCommError(FHandle, Errors, @ComStat) then SCError;
  Result := ComStat;
end;

function TSerialConnection.InBufUsed: cardinal;
begin
  Result := GetComStat.cbInQue;
end;

function TSerialConnection.OutBufUsed: cardinal;
begin
  Result := GetComStat.cbOutQue;
end;

function TSerialConnection.RTSHigh: boolean;
begin
  Result := EscapeCommFunction(FHandle, SETRTS);
end;

function TSerialConnection.RTSLow: boolean;
begin
  Result := EscapeCommFunction(FHandle, CLRRTS);
end;

function TSerialConnection.DTRHigh: boolean;
begin
  Result := EscapeCommFunction(FHandle, SETDTR);
end;

function TSerialConnection.DTRLow: boolean;
begin
  Result := EscapeCommFunction(FHandle, CLRDTR);
end;

procedure TSerialConnection.SetBreakState(const Value: boolean);
begin
  if Value then
  begin
    if not SetCommBreak(FHandle) then SCError;
  end
  else
  begin
    if not ClearCommBreak(FHandle) then SCError;
  end;
end;

function TSerialConnection.ReadString2(const Count: integer;
  const TimeOut: cardinal): string;
var
  T: cardinal;
begin
    Result := '';
  if Count = 0 then Exit;
  T := GetTickCount;
  repeat
    if InBufUsed >= Count then
    begin
      Result := ReadString(Count);
      Exit;
    end;

    if GetTickCount - T > TimeOut then
      Exit;

    Sleep(10);
  until False;
end;

end.

Kolay gelsin...

Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen aslangeri »

@polatkadir; önerin için teşekkür ederim.
en kısa zamanda deniyeceğim inş.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen adelphiforumz »

S.A.
küçük bir test programı yaptım belki işinize yarar ekteki linkten indirebilirsiniz.

http://rapidshare.com/files/279863356/ComportTest.zip
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla