Wednesday, March 20, 2013

Tips #1 - C# වලින් Serial Port එකත් එක්ක Communicate කිරීම



                මම අද කතා කරන්න යන්නේ අපේ මූළික පාඩම් මාලා වලින් පොඩ්ඩකට මිදිල ඔයාලට වැදගත් වේවි කියල හිතෙන codes ගැන කතා කරන්නයි. මටත් මේ ගැන යොයන්න වුනේ මගේ යාළුවෙකුගේ අවශ්‍ය තාවයකට program එකක් ලියන්න වුන නිසියි. ඉතින් මම හිතුවා ඔයාලත් එක්කත් ඒ දේවල් බෙදා ගන්න.

ඇයි අපිට Port Programming අවශ්‍යය


                සමහර programs වලදි අපිට අපේ computer  එකට පිටතින් ඇති hardware එකකින් data ගන්න සහ ඒවාට data යවන්න  අවශ්‍ය වෙනව. මේ සඳහා අපිට computer එකේ තිබෙන විවිධ වූ ports භාවිතා කරන්න පුළුවන් වුනත් අපි අතර ජනප්‍රිය වුන port එකක් තියෙනව ඒ සඳහා, ඒ තමයි Serial Port එක. නමුත් දැන් නම් ගොඩක් computers වල මේ port එක එන්නේ නෑ. නමුත් භාවිතයේ සරල බව නිසාම (USB වලට සාපේක්ෂව) අදටත් භාවිතා වෙනව. ඒ නිසා මම හිතුව ඒ ගැන කතා කරන්න.

Program එක ගැන


                   මම code කරන්න තෝර ගත්තේ C#.Net කියන  programming language එක, ඒ සඳහා විශේෂ හේතුවක් නැති වුවත් C# කියන්නේ මගේ ප්‍රියතම programming language එක නිසා තොරගත්ත. .Net වලදි නම් මෙය ඉතා පහසු කරල තියෙනව Framework එක මගින්. 

අපි මුලින්ම කරන්න ඕන අවශ්‍ය කරන system classes ටික import කර ගන්න ඒක,

using System.IO.Ports;
using System.Threading;

දැන් අපි serial port object එකක් අවශ්‍ය කරන parameters දීල හදාගන්න ඕන.

SerialPort myserialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
myserialPort.Handshake = Handshake.None;

ඊළගට අපි event handler එකක් හඳා ගන්න ඕන serial port එකට data ලැබුනම run වෙන්න,

myserialPort.DataReceived += new SerialDataReceivedEventHandler(SP_DataReceived);

දැන් අපි හදා ගත්ත serial port එක open කරන්න ඕන ඒක භාවිතා කරන්න කලින්.

myserialPort.Open();

දැන් අපි අපේ  computer එකේ serial port එක හරහා data ලබා ගන්න සහ යවන්න සූදානම්. අපිට serial port එකෙන් ලැබෙන data, UI එකට ගන්න delegate භාවිතා කරන්න වෙනව. ඒ .Net framework එක cross-thread actions වලට ඉඩ ලබා නොදෙන නිසා. අපි delegate භාවිතා කරන්නෙ Non-UI Thread එකක ඉදල UI Thread එකට data ලියන්නයි.

private delegate void SetTextDeleg(string text);

දැන් අපි කලින් හදා ගත්ත event handler එකට ලබා දුන්න method එක code කරන්න ඕන data ලැබුනම run වෙන්න.

void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(500);
    string data = _serialPort.ReadLine();
    this.BeginInvoke(new SetTextDeleg(SI_DataReceived), new object[] { data });
}

දැන් SI_DataReceived method එක code කරන්න ඕන අපිට ලැබෙව data UI එකට ලියන්න.

private void si_DataReceived(string data) 
{
  textBox1.Text = data.Trim(); 
}

Data ගන්න වැඩේ හරි දැන්, අපි බලමු කොහොමද data යවන්නේ කියල, ඒ සඳහාත් අපි පොඩි method එකක් ලියමු. data ලියන්න කලින් අනිවාර්යයෙන්ම port එක open කරල තියෙන්න ඕන.

try
{
  if(!(myserialPort.IsOpen))
        myserialPort.Open();
        myserialPort.Write("SI\r\n");
}
catch (Exception ex)
{
  MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
}

දැන් ඔක්කොම වැඩ ටික හරි. අවසානයටම ඔයාලගේ program එක close වෙන කොට port එක close කරන්න.

myserialPort.Close();

මම මේ code එක ඉතාමත් සරල අන්දමින් කලේ ඔයාලට අවශ්‍ය නම් මේක තව සංකීර්ණ ලෙස ඔයාලගේ අවශ්‍යතාවවය අනුව යොදාගන්න පුළුවන්.

23 comments:

  1. මට ඔය delegate කියන ක්‍රමය ගැන දැනගන්න ඔ්න ඒ ගැන vb.net ලිපියක් පලකරනවද

    ReplyDelete
    Replies
    1. ඉක්මනින්ම ඒ ගැනත් කියන්නම්කෝ....

      Delete
    2. ඔව් ඔව් ඉක්මනටම කියන්න.මමත් මේ ලිපිය කියවන අතරතුරේ මේ ගැන කියන්න කියල කොමෙන්ට් එකක් දාන්න හිතුවේ... :)

      Delete
    3. හොඳයි හොඳයි මම ඊලග ලිපිය විදිහට ඒක දාන්නම් කෝ...

      Delete
  2. ලොවෙත් නෑ... සිරා බ්ලොග් එක.. ඇයි මට මේක කලින් හම්බ නොවුනේ අයියෝ....

    ReplyDelete
    Replies
    1. ටිකක් හෙව්වනම් හම්බ වෙනව.... :)

      Delete
  3. මම vb.net වලින් keyman වගේ සොෆ්ට්වෙයා එකක් හදමින් ඉන්නවා ඒකේ keystroke ලබාගන්න ආකාරය හා keystroke දෙන ක්‍රමය කියලාදෙන්න පුලුවන්ද

    ReplyDelete
    Replies
    1. මුලින්ම කියන්න ඕන ඔයා VB නැතුව C# වගේ භාවිතා කරනවානම් වැඩේ ලේසි වෙනව. මොකද ටිකක් advance දේවල් vb වලින් code කරන කොට පන යනව. keystrokes ගන්න ක්‍රමය ඇත්තටම මට මතක නෑ මේ වෙලාවේ. මම ඒක හොයල ඔයාට කියන්නම්.

      Delete
  4. ඔය වැඩේදිත් delegate කතාවක් තියෙනවා මම කෝඩ් එකක් හොයා ගත්තා ඒක තේරුම් මදි ඒකයි ඇහුවේ

    ReplyDelete
    Replies
    1. ඔයා හොයාගත්ත code එක මට එවනවද එතකොට මට ඒක බලල ඔයාට විස්තර කරල දෙන්න පුළුවන්.

      Delete

  5. https://www.dropbox.com/s/7ainnfiznqywt8d/keyboard_hook_test.rar

    මේ කයි මම කිව්ව ෆ්‍රෝග්‍රෑම් එක මේකෙ එකම key stroke එක දෙපාරක් පෙන්වනවා ඒකට හේතුව දැනගත යුතුයි
    ඒ වගෙම key stroke ලබාදෙන විදියත් කියලා දෙන්න

    ReplyDelete
    Replies
    1. මම ඉක්මනින් ඔයාට උත්තරයක් දෙන්නම්...

      Delete
    2. මං ගාව තියෙන code එකක් ඔයාට දෙන්නම් මේක C# code එකක්. මම හිතන්නේ මේ code එක තේරුම් ගන්න ලේසි වේවි ඔයාට. මේ App එක නම් console එකක්. ඒ වුනත් ඔයාට Module එක use කරන්න පුළුවන්.
      https://www.dropbox.com/s/w9aau6yiqivcvdr/ArticleKeyLog.rar

      Delete
  6. උදව්වට බොහොම ස්තුතියි මට key stroke දෙන හැටිත් කියල ෙදනවද

    ReplyDelete
    Replies
    1. ඔයා පොඩ්ඩක් මේ article එක බලන්නකෝ....http://www.codeproject.com/Articles/18366/Sending-Keystrokes-to-another-Application-in-C

      Delete
  7. මම ඔයාගේ උපදෙස් අනුව කී මෑන් වගේ වෘදුකාංගයක් හදමින් ඉන්නවා.
    දැනට හදපු එක මෙතනින් ගන්න.

    https://www.dropbox.com/s/4xt7f4lt2oayrs8/key_board_hook_test.zip

    දැනට fm-abhaya වලට හදපු කොටස සෑහෙන්න ඉවරයි.
    ඔෆීස් 2013 දී කී මෑන්වල අවුලක් තියෙනවා මේකේ ඒ ප්‍රශ්නේ නෑ.
    මම මෙතන දී බලාපොරොත්තු වෙන්නේ යුනිකේත විජයසේකර යතුරු පුවරුව පාවිච්චි කරන්න.
    මට තව උදව්වක් ඕන වෙලා තියෙනවා ,වම් Alt බොත්තම ඔබලා “ද“ එබුවාම ඳ වැදෙන විදියට මේක හදන හැටි කියලා දෙනවද? ලොකු උදව්වක්.(මම හිතන්නේ මෙතන දී Alt යතුර එබුවාම key stroke මෙම මෘදුකාංගයට විතරක් ලැබෙන විදියට සැකසිය යුතුයි.) ඒ වගේම timer එකක් නැතුව කෙලින්ම යතුරක් ඔබන විටම මෘදුකාංගය ක්‍රියා කරවන්න පුලුවන් විදියකුත් හැකිනම් කියා දෙන්න

    ReplyDelete
    Replies
    1. මට ඉතාමත් සතුටුයි ජගත් ඔයා ගැන. ඔයා කරන්න හඳන්නේ ඉතාමත් වටිනා දෙයක් මම මට පුළුවන් හැම උදව්වක්ම කරන්නම්. මම මේ ගැනත් බලල ඉක්මනින්ම ඔයාට පිළිතුරක් දෙන්නම්.

      Delete
    2. ඔයා පොඩ්ඩක් මේ Tutorial එක බලනවද මම හිතන්නේ ඔයා හොයන දේ එතන තියෙනව.. http://revolt.alexjf.net/blog.php?action=read&item=15

      Delete
    3. මම සෑහෙන දුරට මෘදුකාංගය අවසන් කලා
      https://www.dropbox.com/sh/99luzxqgvrda6yh/JpjWOoL0DW/KeyMan_1.1.rar
      මට තව උදව් දෙකක් ඕනවෙලා තියෙනවා
      1. මේකෙ Alt + "ද" ගැහුවාම “ඳ“ වැදෙනවා නමුත් ඉන්පසු backspace
      එබුවාම Undo වෙනවා මේකට හේතුව හොයලා දෙන්න
      (පස්සේ මම පොඩි විසඳුමක් මේකට හොයාගත්තා Alt ඔබලා අතහැරියාම chr(2) වැදෙන්න සලස්සලා
      මේකට හේතුව මොකක්ද? බලන්න
      https://www.dropbox.com/s/gr9b6j3hz4y2n35/KeyMan_1.1X.rar )

      2. MS WORD වලින් ෆොන්ටයක් තේරුවාම මේකෙ ඒකට අදාල ක්ලාස් එක ලෝඩ් වෙන්න
      WORD plugin එකක් හදන හැටි හැකිනම් කියලා දෙන්න

      මේක විජයසේකර සිංහල යුනිකේත යතුරු පුවරුවට අනුව හදලා තියෙනවා
      වෙනසකට තියෙන්නේ ඉස්පිලි හෝ පා පිලි දෙකක් එබුවාම දීර්ඝ ඉස්පිල්ල හෝ පාපිල්ල වැදෙන විදියට හදලා තියෙනවා

      Delete
    4. ඇත්තටම ඔයා කරන්න අගය කළ යුතු දෙයක් ..... මගෙන් සුබ පැතුම්... (y)

      Delete
  8. macho man me programe language gena mukuth danne ne bn vbs nam dnnw bn mewa igena ganne kohend kiypnkoo

    ReplyDelete
    Replies
    1. මේක බලන්න;

      https://www.lynda.com/C-tutorials/C-Essential-Training/188207-2.html
      https://www.tutorialspoint.com/csharp/
      https://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners

      Delete
  9. මෙම ලිපිය ඉතා ප්රයෝජනවත්.මම
    මගේ බ්ලොග් අඩවිය තුළ C # හා වෙනත් Microsoft .net මාතෘකා පිළිබඳ ලිපි ලිවීමට ඇත http://www.dotnetstuffs.com

    ReplyDelete