Posted to tcl by nikos at Mon May 13 18:50:40 GMT 2013view raw

  1. proc send_msg1 {str addr port} {
  2. global fh
  3. ###open serial port
  4. catch_fh $port
  5. #set fh [open $port "RDWR"]
  6. fconfigure $fh -mode 9600,e,7,2 -handshake rtscts -buffering none -blocking 0 -translation cr
  7. set sum "[chksum [join @$addr$str]]"
  8. set msg "[join @$addr$str$sum*]"
  9. #channel translation is "cr", so this appended to msg automagically
  10. puts "msg was: $msg"
  11. puts $fh "$msg"
  12. ##set callback when port becomes readable, e.g plc responds...
  13. fileevent $fh readable [list read_handler $fh]
  14. }
  15.  
  16.  
  17.  
  18. proc catch_fh {port} {
  19. ###don't want fh in local scope so it can be closed manually
  20. ###in an uncaught error
  21. global fh
  22. if {[list [catch {open $port "RDWR"} fh]]} {
  23. puts "Could not open $port \n$fh"
  24. return
  25. } else {
  26. #puts "$::fh"
  27. puts "opened $port"
  28. puts "handle is: $fh"
  29. #close $fh
  30. }
  31. }
  32.  
  33. proc send_msg1 {str addr port} {
  34. global fh
  35. ###open serial port
  36. catch_fh $port
  37. #set fh [open $port "RDWR"]
  38. fconfigure $fh -mode 9600,e,7,2 -handshake rtscts -buffering none -blocking 0 -translation cr
  39. set sum "[chksum [join @$addr$str]]"
  40. set msg "[join @$addr$str$sum*]"
  41. #channel translation is "cr", so this appended to msg automagically
  42. puts "msg was: $msg"
  43. puts $fh "$msg"
  44. ##set callback when port becomes readable, e.g plc responds...
  45. fileevent $fh readable [list read_handler $fh]
  46. }
  47.  
  48. proc read_handler {fh} {
  49. set response "[read $fh]"
  50. puts "response was $response"
  51. set endcode "[string range $response 5 6]"
  52. puts "$endcode"
  53. switch $endcode {
  54. 00 {
  55. # no error
  56. close $fh
  57. return
  58. }
  59. default {
  60. puts "There was an error in the command: $msg"
  61. close $fh
  62. return
  63. }
  64. }
  65. }
  66.  
  67.